|
Pierre-Yves Chibon |
7937d2 |
# -*- coding: utf-8 -*-
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
"""
|
|
Pierre-Yves Chibon |
7937d2 |
(c) 2018 - Copyright Red Hat Inc
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
Authors:
|
|
Pierre-Yves Chibon |
7937d2 |
Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
"""
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
67d1cc |
from __future__ import unicode_literals, absolute_import
|
|
Aurélien Bompard |
dcf6f6 |
|
|
Pierre-Yves Chibon |
7937d2 |
import datetime
|
|
Pierre-Yves Chibon |
7937d2 |
import hashlib
|
|
Pierre-Yves Chibon |
7937d2 |
import hmac
|
|
Pierre-Yves Chibon |
7937d2 |
import json
|
|
Pierre-Yves Chibon |
7937d2 |
import os
|
|
Pierre-Yves Chibon |
7937d2 |
import os.path
|
|
Pierre-Yves Chibon |
7937d2 |
import time
|
|
Pierre-Yves Chibon |
7937d2 |
import uuid
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
import requests
|
|
Pierre-Yves Chibon |
7937d2 |
import six
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
from celery import Celery
|
|
Pierre-Yves Chibon |
24747e |
from celery.signals import after_setup_task_logger
|
|
Pierre-Yves Chibon |
24747e |
from celery.utils.log import get_task_logger
|
|
Pierre-Yves Chibon |
7937d2 |
from kitchen.text.converters import to_bytes
|
|
Pierre-Yves Chibon |
bd0202 |
from sqlalchemy.exc import SQLAlchemyError
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
930073 |
import pagure.lib.query
|
|
Pierre-Yves Chibon |
7937d2 |
from pagure.config import config as pagure_config
|
|
Pierre-Yves Chibon |
1aac43 |
from pagure.lib.tasks_utils import pagure_task
|
|
Pierre-Yves Chibon |
e64e62 |
from pagure.mail_logging import format_callstack
|
|
Clement Verna |
f5181b |
from pagure.lib.lib_ci import trigger_jenkins_build
|
|
Pierre-Yves Chibon |
24747e |
from pagure.utils import split_project_fullname, set_up_logging
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
# logging.config.dictConfig(pagure_config.get('LOGGING') or {'version': 1})
|
|
Pierre-Yves Chibon |
24747e |
_log = get_task_logger(__name__)
|
|
Pierre-Yves Chibon |
7937d2 |
_i = 0
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
9c2953 |
if os.environ.get("PAGURE_BROKER_URL"): # pragma: no cover
|
|
Pierre-Yves Chibon |
9c2953 |
broker_url = os.environ["PAGURE_BROKER_URL"]
|
|
Pierre-Yves Chibon |
9c2953 |
elif pagure_config.get("BROKER_URL"):
|
|
Pierre-Yves Chibon |
9c2953 |
broker_url = pagure_config["BROKER_URL"]
|
|
Pierre-Yves Chibon |
7937d2 |
else:
|
|
Pierre-Yves Chibon |
9c2953 |
broker_url = "redis://%s" % pagure_config["REDIS_HOST"]
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
9c2953 |
conn = Celery("tasks", broker=broker_url, backend=broker_url)
|
|
Pierre-Yves Chibon |
9c2953 |
conn.conf.update(pagure_config["CELERY_CONFIG"])
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
24747e |
@after_setup_task_logger.connect
|
|
Pierre-Yves Chibon |
24747e |
def augment_celery_log(**kwargs):
|
|
Pierre-Yves Chibon |
24747e |
set_up_logging(force=True)
|
|
Pierre-Yves Chibon |
24747e |
|
|
Pierre-Yves Chibon |
24747e |
|
|
Pierre-Yves Chibon |
7937d2 |
def call_web_hooks(project, topic, msg, urls):
|
|
Pierre-Yves Chibon |
9c2953 |
""" Sends the web-hook notification. """
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("Processing project: %s - topic: %s", project.fullname, topic)
|
|
Pierre-Yves Chibon |
9c2953 |
_log.debug("msg: %s", msg)
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
# Send web-hooks notification
|
|
Pierre-Yves Chibon |
7937d2 |
global _i
|
|
Pierre-Yves Chibon |
7937d2 |
_i += 1
|
|
Pierre-Yves Chibon |
7937d2 |
year = datetime.datetime.utcnow().year
|
|
Pierre-Yves Chibon |
7937d2 |
if isinstance(topic, six.text_type):
|
|
Pierre-Yves Chibon |
9c2953 |
topic = to_bytes(topic, encoding="utf8", nonstring="passthru")
|
|
Pierre-Yves Chibon |
9c2953 |
msg["pagure_instance"] = pagure_config["APP_URL"]
|
|
Pierre-Yves Chibon |
9c2953 |
msg["project_fullname"] = project.fullname
|
|
Pierre-Yves Chibon |
7937d2 |
msg = dict(
|
|
Pierre-Yves Chibon |
9c2953 |
topic=topic.decode("utf-8"),
|
|
Pierre-Yves Chibon |
7937d2 |
msg=msg,
|
|
Pierre-Yves Chibon |
7937d2 |
timestamp=int(time.time()),
|
|
Aurélien Bompard |
619e2a |
msg_id="%s-%s" % (year, uuid.uuid4()),
|
|
Pierre-Yves Chibon |
7937d2 |
i=_i,
|
|
Pierre-Yves Chibon |
7937d2 |
)
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
941093 |
content = json.dumps(msg, sort_keys=True)
|
|
Pierre-Yves Chibon |
7937d2 |
hashhex = hmac.new(
|
|
Pierre-Yves Chibon |
9c2953 |
project.hook_token.encode("utf-8"),
|
|
Pierre-Yves Chibon |
9c2953 |
content.encode("utf-8"),
|
|
Pierre-Yves Chibon |
9c2953 |
hashlib.sha1,
|
|
Pierre-Yves Chibon |
9c2953 |
).hexdigest()
|
|
Pierre-Yves Chibon |
7937d2 |
hashhex256 = hmac.new(
|
|
Pierre-Yves Chibon |
9c2953 |
project.hook_token.encode("utf-8"),
|
|
Pierre-Yves Chibon |
9c2953 |
content.encode("utf-8"),
|
|
Pierre-Yves Chibon |
9c2953 |
hashlib.sha256,
|
|
Pierre-Yves Chibon |
9c2953 |
).hexdigest()
|
|
Pierre-Yves Chibon |
7937d2 |
headers = {
|
|
Pierre-Yves Chibon |
9c2953 |
"X-Pagure": pagure_config["APP_URL"],
|
|
Pierre-Yves Chibon |
9c2953 |
"X-Pagure-project": project.fullname,
|
|
Pierre-Yves Chibon |
9c2953 |
"X-Pagure-Signature": hashhex,
|
|
Pierre-Yves Chibon |
9c2953 |
"X-Pagure-Signature-256": hashhex256,
|
|
Pierre-Yves Chibon |
9c2953 |
"X-Pagure-Topic": topic,
|
|
Pierre-Yves Chibon |
9c2953 |
"Content-Type": "application/json",
|
|
Pierre-Yves Chibon |
7937d2 |
}
|
|
Pierre-Yves Chibon |
941093 |
for url in sorted(urls):
|
|
Pierre-Yves Chibon |
7937d2 |
url = url.strip()
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("Calling url %s" % url)
|
|
Pierre-Yves Chibon |
7937d2 |
try:
|
|
Patrick Uiterwijk |
3f97f6 |
req = requests.post(url, headers=headers, data=content, timeout=60)
|
|
Pierre-Yves Chibon |
7937d2 |
if not req:
|
|
Pierre-Yves Chibon |
7937d2 |
_log.info(
|
|
Pierre-Yves Chibon |
9c2953 |
"An error occured while querying: %s - "
|
|
Pierre-Yves Chibon |
9c2953 |
"Error code: %s" % (url, req.status_code)
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
7937d2 |
except (requests.exceptions.RequestException, Exception) as err:
|
|
Pierre-Yves Chibon |
7937d2 |
_log.info(
|
|
Pierre-Yves Chibon |
9c2953 |
"An error occured while querying: %s - Error: %s" % (url, err)
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
9c2953 |
@conn.task(queue=pagure_config.get("WEBHOOK_CELERY_QUEUE", None), bind=True)
|
|
Slavek Kabrda |
efeaa6 |
@pagure_task
|
|
Pierre-Yves Chibon |
7937d2 |
def webhook_notification(
|
|
Pierre-Yves Chibon |
9c2953 |
self, session, topic, msg, namespace=None, name=None, user=None
|
|
Pierre-Yves Chibon |
9c2953 |
):
|
|
Pierre-Yves Chibon |
7937d2 |
""" Send webhook notifications about an event on that project.
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Slavek Kabrda |
efeaa6 |
:arg session: SQLAlchemy session object
|
|
Slavek Kabrda |
efeaa6 |
:type session: sqlalchemy.orm.session.Session
|
|
Pierre-Yves Chibon |
7937d2 |
:arg topic: the topic for the notification
|
|
Pierre-Yves Chibon |
7937d2 |
:type topic: str
|
|
Pierre-Yves Chibon |
7937d2 |
:arg msg: the message to send via web-hook
|
|
Pierre-Yves Chibon |
7937d2 |
:type msg: str
|
|
Pierre-Yves Chibon |
7937d2 |
:kwarg namespace: the namespace of the project
|
|
Pierre-Yves Chibon |
7937d2 |
:type namespace: None or str
|
|
Pierre-Yves Chibon |
7937d2 |
:kwarg name: the name of the project
|
|
Pierre-Yves Chibon |
7937d2 |
:type name: None or str
|
|
Pierre-Yves Chibon |
7937d2 |
:kwarg user: the user of the project, only set if the project is a fork
|
|
Pierre-Yves Chibon |
7937d2 |
:type user: None or str
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
"""
|
|
Pierre-Yves Chibon |
930073 |
project = pagure.lib.query._get_project(
|
|
Pierre-Yves Chibon |
9c2953 |
session, namespace=namespace, name=name, user=user
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
7937d2 |
if not project:
|
|
Pierre-Yves Chibon |
7937d2 |
session.close()
|
|
Pierre-Yves Chibon |
7937d2 |
raise RuntimeError(
|
|
Pierre-Yves Chibon |
9c2953 |
"Project: %s/%s from user: %s not found in the DB"
|
|
Pierre-Yves Chibon |
9c2953 |
% (namespace, name, user)
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
9c2953 |
urls = project.settings.get("Web-hooks")
|
|
Pierre-Yves Chibon |
7937d2 |
if not urls:
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("No URLs set: %s" % urls)
|
|
Pierre-Yves Chibon |
7937d2 |
return
|
|
Pierre-Yves Chibon |
7937d2 |
|
|
Pierre-Yves Chibon |
9c2953 |
urls = urls.split("\n")
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("Got the project and urls, going to the webhooks")
|
|
Pierre-Yves Chibon |
7937d2 |
call_web_hooks(project, topic, msg, urls)
|
|
Pierre-Yves Chibon |
bd0202 |
|
|
Pierre-Yves Chibon |
bd0202 |
|
|
Pierre-Yves Chibon |
9c2953 |
@conn.task(queue=pagure_config.get("LOGCOM_CELERY_QUEUE", None), bind=True)
|
|
Slavek Kabrda |
efeaa6 |
@pagure_task
|
|
Pierre-Yves Chibon |
bd0202 |
def log_commit_send_notifications(
|
|
Pierre-Yves Chibon |
9c2953 |
self,
|
|
Pierre-Yves Chibon |
9c2953 |
session,
|
|
Pierre-Yves Chibon |
9c2953 |
name,
|
|
Pierre-Yves Chibon |
9c2953 |
commits,
|
|
Pierre-Yves Chibon |
9c2953 |
abspath,
|
|
Pierre-Yves Chibon |
9c2953 |
branch,
|
|
Pierre-Yves Chibon |
9c2953 |
default_branch,
|
|
Pierre-Yves Chibon |
9c2953 |
namespace=None,
|
|
Pierre-Yves Chibon |
9c2953 |
username=None,
|
|
Pierre-Yves Chibon |
9c2953 |
):
|
|
Pierre-Yves Chibon |
bd0202 |
""" Send webhook notifications about an event on that project.
|
|
Pierre-Yves Chibon |
bd0202 |
|
|
Slavek Kabrda |
efeaa6 |
:arg session: SQLAlchemy session object
|
|
Slavek Kabrda |
efeaa6 |
:type session: sqlalchemy.orm.session.Session
|
|
Pierre-Yves Chibon |
bd0202 |
:arg topic: the topic for the notification
|
|
Pierre-Yves Chibon |
bd0202 |
:type topic: str
|
|
Pierre-Yves Chibon |
bd0202 |
:arg msg: the message to send via web-hook
|
|
Pierre-Yves Chibon |
bd0202 |
:type msg: str
|
|
Pierre-Yves Chibon |
bd0202 |
:kwarg namespace: the namespace of the project
|
|
Pierre-Yves Chibon |
bd0202 |
:type namespace: None or str
|
|
Pierre-Yves Chibon |
bd0202 |
:kwarg name: the name of the project
|
|
Pierre-Yves Chibon |
bd0202 |
:type name: None or str
|
|
Pierre-Yves Chibon |
bd0202 |
:kwarg user: the user of the project, only set if the project is a fork
|
|
Pierre-Yves Chibon |
bd0202 |
:type user: None or str
|
|
Pierre-Yves Chibon |
bd0202 |
|
|
Pierre-Yves Chibon |
bd0202 |
"""
|
|
Pierre-Yves Chibon |
bd0202 |
_log.info(
|
|
Pierre-Yves Chibon |
9c2953 |
"Looking for project: %s%s of %s",
|
|
Pierre-Yves Chibon |
9c2953 |
"%s/" % namespace if namespace else "",
|
|
Pierre-Yves Chibon |
bd0202 |
name,
|
|
Pierre-Yves Chibon |
9c2953 |
username,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
930073 |
project = pagure.lib.query._get_project(
|
|
Pierre-Yves Chibon |
9c2953 |
session, name, user=username, namespace=namespace
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
bd0202 |
|
|
Pierre-Yves Chibon |
bd0202 |
if not project:
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("No project found")
|
|
Pierre-Yves Chibon |
bd0202 |
return
|
|
Pierre-Yves Chibon |
bd0202 |
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("Found project: %s", project.fullname)
|
|
Pierre-Yves Chibon |
bd0202 |
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("Processing %s commits in %s", len(commits), abspath)
|
|
Pierre-Yves Chibon |
bd0202 |
|
|
Pierre-Yves Chibon |
bd0202 |
# Only log commits when the branch is the default branch
|
|
Pierre-Yves Chibon |
fccbed |
log_all = pagure_config.get("LOG_ALL_COMMITS", False)
|
|
Pierre-Yves Chibon |
fccbed |
if log_all or branch == default_branch:
|
|
Pierre-Yves Chibon |
9c2953 |
pagure.lib.git.log_commits_to_db(session, project, commits, abspath)
|
|
Pierre-Yves Chibon |
0ac4b3 |
else:
|
|
Pierre-Yves Chibon |
0ac4b3 |
_log.info(
|
|
Pierre-Yves Chibon |
0ac4b3 |
"Not logging commits not made on the default branch: %s",
|
|
Lenka Segura |
643d50 |
default_branch,
|
|
Pierre-Yves Chibon |
0ac4b3 |
)
|
|
Pierre-Yves Chibon |
bd0202 |
|
|
Pierre-Yves Chibon |
bd0202 |
# Notify subscribed users that there are new commits
|
|
Pierre-Yves Chibon |
0ac4b3 |
email_watchcommits = pagure_config.get("EMAIL_ON_WATCHCOMMITS", True)
|
|
Pierre-Yves Chibon |
0ac4b3 |
_log.info("Sending notification about the commit: %s", email_watchcommits)
|
|
Pierre-Yves Chibon |
0ac4b3 |
if email_watchcommits:
|
|
Pierre-Yves Chibon |
9c2953 |
pagure.lib.notify.notify_new_commits(abspath, project, branch, commits)
|
|
Pierre-Yves Chibon |
bd0202 |
|
|
Pierre-Yves Chibon |
bd0202 |
try:
|
|
Pierre-Yves Chibon |
bd0202 |
session.commit()
|
|
Pierre-Yves Chibon |
bd0202 |
except SQLAlchemyError as err: # pragma: no cover
|
|
Pierre-Yves Chibon |
bd0202 |
_log.exception(err)
|
|
Pierre-Yves Chibon |
bd0202 |
session.rollback()
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
50d6b6 |
def get_files_to_load(title, new_commits_list, abspath):
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("%s: Retrieve the list of files changed" % title)
|
|
Pierre-Yves Chibon |
50d6b6 |
file_list = []
|
|
Pierre-Yves Chibon |
50d6b6 |
new_commits_list.reverse()
|
|
Pierre-Yves Chibon |
50d6b6 |
n = len(new_commits_list)
|
|
Pierre-Yves Chibon |
50d6b6 |
for idx, commit in enumerate(new_commits_list):
|
|
Pierre-Yves Chibon |
50d6b6 |
if (idx % 100) == 0:
|
|
Pierre-Yves Chibon |
50d6b6 |
_log.info(
|
|
Pierre-Yves Chibon |
9c2953 |
"Loading files change in commits for %s: %s/%s", title, idx, n
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
50d6b6 |
if commit == new_commits_list[0]:
|
|
Pierre-Yves Chibon |
50d6b6 |
filenames = pagure.lib.git.read_git_lines(
|
|
Pierre-Yves Chibon |
9c2953 |
[
|
|
Pierre-Yves Chibon |
9c2953 |
"diff-tree",
|
|
Pierre-Yves Chibon |
9c2953 |
"--no-commit-id",
|
|
Pierre-Yves Chibon |
9c2953 |
"--name-only",
|
|
Pierre-Yves Chibon |
9c2953 |
"-r",
|
|
Pierre-Yves Chibon |
9c2953 |
"--root",
|
|
Pierre-Yves Chibon |
9c2953 |
commit,
|
|
Pierre-Yves Chibon |
9c2953 |
],
|
|
Pierre-Yves Chibon |
9c2953 |
abspath,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
50d6b6 |
else:
|
|
Pierre-Yves Chibon |
50d6b6 |
filenames = pagure.lib.git.read_git_lines(
|
|
Pierre-Yves Chibon |
9c2953 |
["diff-tree", "--no-commit-id", "--name-only", "-r", commit],
|
|
Pierre-Yves Chibon |
9c2953 |
abspath,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
50d6b6 |
for line in filenames:
|
|
Pierre-Yves Chibon |
50d6b6 |
if line.strip():
|
|
Pierre-Yves Chibon |
50d6b6 |
file_list.append(line.strip())
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
50d6b6 |
return file_list
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
9c2953 |
@conn.task(queue=pagure_config.get("LOADJSON_CELERY_QUEUE", None), bind=True)
|
|
Slavek Kabrda |
efeaa6 |
@pagure_task
|
|
Pierre-Yves Chibon |
50d6b6 |
def load_json_commits_to_db(
|
|
Pierre-Yves Chibon |
9c2953 |
self,
|
|
Pierre-Yves Chibon |
9c2953 |
session,
|
|
Pierre-Yves Chibon |
9c2953 |
name,
|
|
Pierre-Yves Chibon |
9c2953 |
commits,
|
|
Pierre-Yves Chibon |
9c2953 |
abspath,
|
|
Pierre-Yves Chibon |
9c2953 |
data_type,
|
|
Pierre-Yves Chibon |
9c2953 |
agent,
|
|
Pierre-Yves Chibon |
9c2953 |
namespace=None,
|
|
Pierre-Yves Chibon |
9c2953 |
username=None,
|
|
Pierre-Yves Chibon |
9c2953 |
):
|
|
Pierre-Yves Chibon |
9c2953 |
""" Loads into the database the specified commits that have been pushed
|
|
Pierre-Yves Chibon |
50d6b6 |
to either the tickets or the pull-request repository.
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
9c2953 |
"""
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
9c2953 |
if data_type not in ["ticket", "pull-request"]:
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("LOADJSON: Invalid data_type retrieved: %s", data_type)
|
|
Pierre-Yves Chibon |
50d6b6 |
return
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
50d6b6 |
_log.info(
|
|
Pierre-Yves Chibon |
9c2953 |
"LOADJSON: Looking for project: %s%s of user: %s",
|
|
Pierre-Yves Chibon |
9c2953 |
"%s/" % namespace if namespace else "",
|
|
Pierre-Yves Chibon |
9c2953 |
name,
|
|
Pierre-Yves Chibon |
9c2953 |
username,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
930073 |
project = pagure.lib.query._get_project(
|
|
Pierre-Yves Chibon |
9c2953 |
session, name, user=username, namespace=namespace
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
50d6b6 |
if not project:
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("LOADJSON: No project found")
|
|
Pierre-Yves Chibon |
50d6b6 |
return
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("LOADJSON: Found project: %s", project.fullname)
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
50d6b6 |
_log.info(
|
|
Pierre-Yves Chibon |
9c2953 |
"LOADJSON: %s: Processing %s commits in %s",
|
|
Pierre-Yves Chibon |
9c2953 |
project.fullname,
|
|
Pierre-Yves Chibon |
9c2953 |
len(commits),
|
|
Pierre-Yves Chibon |
9c2953 |
abspath,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
50d6b6 |
file_list = set(get_files_to_load(project.fullname, commits, abspath))
|
|
Pierre-Yves Chibon |
50d6b6 |
n = len(file_list)
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("LOADJSON: %s files to process" % n)
|
|
Pierre-Yves Chibon |
6b7c8d |
mail_body = [
|
|
Pierre-Yves Chibon |
6b7c8d |
"Good Morning",
|
|
Pierre-Yves Chibon |
6b7c8d |
"",
|
|
Pierre-Yves Chibon |
6b7c8d |
"This is the log of loading all the files pushed in the git repo into",
|
|
Pierre-Yves Chibon |
6b7c8d |
"the database. It should ignore files that are not JSON files, this",
|
|
Pierre-Yves Chibon |
6b7c8d |
"is fine.",
|
|
Pierre-Yves Chibon |
6b7c8d |
"",
|
|
Pierre-Yves Chibon |
6b7c8d |
]
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
941093 |
for idx, filename in enumerate(sorted(file_list)):
|
|
Pierre-Yves Chibon |
50d6b6 |
_log.info(
|
|
Pierre-Yves Chibon |
9c2953 |
"LOADJSON: Loading: %s: %s -- %s/%s",
|
|
Pierre-Yves Chibon |
9c2953 |
project.fullname,
|
|
Pierre-Yves Chibon |
9c2953 |
filename,
|
|
Pierre-Yves Chibon |
9c2953 |
idx + 1,
|
|
Pierre-Yves Chibon |
9c2953 |
n,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
9c2953 |
tmp = "Loading: %s -- %s/%s" % (filename, idx + 1, n)
|
|
Pierre-Yves Chibon |
7cf3c9 |
try:
|
|
Pierre-Yves Chibon |
7cf3c9 |
json_data = None
|
|
Pierre-Yves Chibon |
7cf3c9 |
data = "".join(
|
|
Pierre-Yves Chibon |
7cf3c9 |
pagure.lib.git.read_git_lines(
|
|
Pierre-Yves Chibon |
7cf3c9 |
["show", "HEAD:%s" % filename], abspath
|
|
Pierre-Yves Chibon |
7cf3c9 |
)
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
7cf3c9 |
if data and not filename.startswith("files/"):
|
|
Pierre-Yves Chibon |
7cf3c9 |
try:
|
|
Pierre-Yves Chibon |
7cf3c9 |
json_data = json.loads(data)
|
|
Pierre-Yves Chibon |
7cf3c9 |
except ValueError:
|
|
Pierre-Yves Chibon |
7cf3c9 |
pass
|
|
Pierre-Yves Chibon |
7cf3c9 |
if json_data:
|
|
Pierre-Yves Chibon |
9c2953 |
if data_type == "ticket":
|
|
Pierre-Yves Chibon |
50d6b6 |
pagure.lib.git.update_ticket_from_git(
|
|
Pierre-Yves Chibon |
50d6b6 |
session,
|
|
Pierre-Yves Chibon |
50d6b6 |
reponame=name,
|
|
Pierre-Yves Chibon |
50d6b6 |
namespace=namespace,
|
|
Pierre-Yves Chibon |
50d6b6 |
username=username,
|
|
Pierre-Yves Chibon |
50d6b6 |
issue_uid=filename,
|
|
Pierre-Yves Chibon |
50d6b6 |
json_data=json_data,
|
|
Pierre-Yves Chibon |
50d6b6 |
agent=agent,
|
|
Pierre-Yves Chibon |
50d6b6 |
)
|
|
Pierre-Yves Chibon |
9c2953 |
elif data_type == "pull-request":
|
|
Pierre-Yves Chibon |
50d6b6 |
pagure.lib.git.update_request_from_git(
|
|
Pierre-Yves Chibon |
50d6b6 |
session,
|
|
Pierre-Yves Chibon |
50d6b6 |
reponame=name,
|
|
Pierre-Yves Chibon |
50d6b6 |
namespace=namespace,
|
|
Pierre-Yves Chibon |
50d6b6 |
username=username,
|
|
Pierre-Yves Chibon |
50d6b6 |
request_uid=filename,
|
|
Pierre-Yves Chibon |
50d6b6 |
json_data=json_data,
|
|
Pierre-Yves Chibon |
50d6b6 |
)
|
|
Pierre-Yves Chibon |
9c2953 |
tmp += " ... ... Done"
|
|
Pierre-Yves Chibon |
7cf3c9 |
else:
|
|
Pierre-Yves Chibon |
7cf3c9 |
tmp += " ... ... SKIPPED - No JSON data"
|
|
Pierre-Yves Chibon |
50d6b6 |
mail_body.append(tmp)
|
|
Pierre-Yves Chibon |
7cf3c9 |
except Exception as err:
|
|
Pierre-Yves Chibon |
7cf3c9 |
_log.info("data: %s", json_data)
|
|
Pierre-Yves Chibon |
7cf3c9 |
session.rollback()
|
|
Pierre-Yves Chibon |
7cf3c9 |
_log.exception(err)
|
|
Pierre-Yves Chibon |
7cf3c9 |
tmp += " ... ... FAILED\n"
|
|
Pierre-Yves Chibon |
7cf3c9 |
tmp += format_callstack()
|
|
Pierre-Yves Chibon |
7cf3c9 |
break
|
|
Pierre-Yves Chibon |
7cf3c9 |
finally:
|
|
Pierre-Yves Chibon |
50d6b6 |
mail_body.append(tmp)
|
|
Pierre-Yves Chibon |
50d6b6 |
|
|
Pierre-Yves Chibon |
50d6b6 |
try:
|
|
Pierre-Yves Chibon |
50d6b6 |
session.commit()
|
|
Pierre-Yves Chibon |
50d6b6 |
_log.info(
|
|
Pierre-Yves Chibon |
9c2953 |
"LOADJSON: Emailing results for %s to %s", project.fullname, agent
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
50d6b6 |
try:
|
|
Pierre-Yves Chibon |
50d6b6 |
if not agent:
|
|
Pierre-Yves Chibon |
50d6b6 |
raise pagure.exceptions.PagureException(
|
|
Pierre-Yves Chibon |
9c2953 |
"No agent found: %s" % agent
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
02b393 |
if agent != "pagure":
|
|
Pierre-Yves Chibon |
930073 |
user_obj = pagure.lib.query.get_user(session, agent)
|
|
Pierre-Yves Chibon |
02b393 |
pagure.lib.notify.send_email(
|
|
Pierre-Yves Chibon |
02b393 |
"\n".join(mail_body),
|
|
Pierre-Yves Chibon |
02b393 |
"Issue import report",
|
|
Pierre-Yves Chibon |
02b393 |
user_obj.default_email,
|
|
Pierre-Yves Chibon |
02b393 |
)
|
|
Karsten Hopp |
3b333e |
except pagure.exceptions.PagureException:
|
|
Pierre-Yves Chibon |
9c2953 |
_log.exception("LOADJSON: Could not find user %s" % agent)
|
|
Karsten Hopp |
3b333e |
except SQLAlchemyError: # pragma: no cover
|
|
Pierre-Yves Chibon |
50d6b6 |
session.rollback()
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("LOADJSON: Ready for another")
|
|
Pierre-Yves Chibon |
abb591 |
|
|
Pierre-Yves Chibon |
abb591 |
|
|
Pierre-Yves Chibon |
9c2953 |
@conn.task(queue=pagure_config.get("CI_CELERY_QUEUE", None), bind=True)
|
|
Slavek Kabrda |
efeaa6 |
@pagure_task
|
|
Pierre-Yves Chibon |
3117a1 |
def trigger_ci_build(
|
|
Pierre-Yves Chibon |
fd1956 |
self,
|
|
Pierre-Yves Chibon |
fd1956 |
session,
|
|
Pierre-Yves Chibon |
fd1956 |
cause,
|
|
Pierre-Yves Chibon |
fd1956 |
branch,
|
|
Pierre-Yves Chibon |
fd1956 |
branch_to,
|
|
Pierre-Yves Chibon |
fd1956 |
ci_type,
|
|
Pierre-Yves Chibon |
fd1956 |
project_name=None,
|
|
Pierre-Yves Chibon |
fd1956 |
pr_uid=None,
|
|
Pierre-Yves Chibon |
998b35 |
):
|
|
Clement Verna |
ba73e0 |
|
|
Pierre-Yves Chibon |
9c2953 |
""" Triggers a new run of the CI system on the specified pull-request.
|
|
Pierre-Yves Chibon |
abb591 |
|
|
Pierre-Yves Chibon |
9c2953 |
"""
|
|
Pierre-Yves Chibon |
9c2953 |
pagure.lib.plugins.get_plugin("Pagure CI")
|
|
Pierre-Yves Chibon |
abb591 |
|
|
Pierre-Yves Chibon |
3117a1 |
if not pr_uid and not project_name:
|
|
Pierre-Yves Chibon |
3117a1 |
_log.debug("No PR UID nor project name specified, can't trigger CI")
|
|
Pierre-Yves Chibon |
3117a1 |
session.close()
|
|
Pierre-Yves Chibon |
3117a1 |
return
|
|
Pierre-Yves Chibon |
3117a1 |
|
|
Pierre-Yves Chibon |
3117a1 |
if pr_uid:
|
|
Pierre-Yves Chibon |
930073 |
pr = pagure.lib.query.get_request_by_uid(session, pr_uid)
|
|
Pierre-Yves Chibon |
3117a1 |
if pr.remote:
|
|
Pierre-Yves Chibon |
b8f078 |
project_name = pr.project.fullname
|
|
Pierre-Yves Chibon |
3117a1 |
else:
|
|
Pierre-Yves Chibon |
3117a1 |
project_name = pr.project_from.fullname
|
|
Pierre-Yves Chibon |
3117a1 |
|
|
Clement Verna |
ba73e0 |
user, namespace, project_name = split_project_fullname(project_name)
|
|
Pierre-Yves Chibon |
abb591 |
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("Pagure-CI: Looking for project: %s", project_name)
|
|
Pierre-Yves Chibon |
930073 |
project = pagure.lib.query.get_authorized_project(
|
|
Pierre-Yves Chibon |
9c2953 |
session=session,
|
|
Pierre-Yves Chibon |
9c2953 |
project_name=project_name,
|
|
Pierre-Yves Chibon |
9c2953 |
user=user,
|
|
Pierre-Yves Chibon |
9c2953 |
namespace=namespace,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
abb591 |
|
|
Clement Verna |
ba73e0 |
if project is None:
|
|
Pierre-Yves Chibon |
9c2953 |
_log.warning(
|
|
Pierre-Yves Chibon |
9c2953 |
"Pagure-CI: No project could be found for the name %s",
|
|
Pierre-Yves Chibon |
9c2953 |
project_name,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
abb591 |
session.close()
|
|
Pierre-Yves Chibon |
abb591 |
return
|
|
Pierre-Yves Chibon |
abb591 |
|
|
Pierre-Yves Chibon |
299281 |
if project.is_fork:
|
|
Pierre-Yves Chibon |
9c2953 |
if (
|
|
Pierre-Yves Chibon |
9c2953 |
project.parent.ci_hook is None
|
|
Pierre-Yves Chibon |
9c2953 |
or project.parent.ci_hook.ci_url is None
|
|
Pierre-Yves Chibon |
9c2953 |
):
|
|
Pierre-Yves Chibon |
299281 |
raise pagure.exceptions.PagureException(
|
|
Pierre-Yves Chibon |
9c2953 |
"Project %s not configured or incorectly configured for ci",
|
|
Pierre-Yves Chibon |
9c2953 |
project.parent.fullname,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
299281 |
elif project.ci_hook is None or project.ci_hook.ci_url is None:
|
|
Pierre-Yves Chibon |
299281 |
raise pagure.exceptions.PagureException(
|
|
Pierre-Yves Chibon |
9c2953 |
"Project %s not configured or incorectly configured for ci",
|
|
Pierre-Yves Chibon |
9c2953 |
project.fullname,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
299281 |
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("Pagure-CI: project retrieved: %s", project.fullname)
|
|
Clement Verna |
ba73e0 |
|
|
Pierre-Yves Chibon |
abb591 |
_log.info(
|
|
Clement Verna |
44c44e |
"Pagure-CI: Trigger from %s cause (PR# or commit) %s branch: %s",
|
|
Pierre-Yves Chibon |
9c2953 |
project.fullname,
|
|
Pierre-Yves Chibon |
9c2953 |
cause,
|
|
Pierre-Yves Chibon |
9c2953 |
branch,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
abb591 |
|
|
Pierre-Yves Chibon |
9c2953 |
if ci_type == "jenkins":
|
|
Clement Verna |
ba73e0 |
|
|
Pierre-Yves Chibon |
9c6dee |
jenk_project = project
|
|
Clement Verna |
ba73e0 |
if project.is_fork:
|
|
Pierre-Yves Chibon |
9c6dee |
jenk_project = project.parent
|
|
Clement Verna |
ba73e0 |
|
|
Pierre-Yves Chibon |
9c2953 |
trigger_jenkins_build(
|
|
Pierre-Yves Chibon |
9c2953 |
project_path=project.path,
|
|
Pierre-Yves Chibon |
9c6dee |
url=jenk_project.ci_hook.ci_url,
|
|
Pierre-Yves Chibon |
9c6dee |
job=jenk_project.ci_hook.ci_job,
|
|
Pierre-Yves Chibon |
9c6dee |
token=jenk_project.ci_hook.pagure_ci_token,
|
|
Pierre-Yves Chibon |
9c2953 |
branch=branch,
|
|
Pierre-Yves Chibon |
fd1956 |
branch_to=branch_to,
|
|
Pierre-Yves Chibon |
9c2953 |
cause=cause,
|
|
Pierre-Yves Chibon |
9c6dee |
ci_username=jenk_project.ci_hook.ci_username,
|
|
Pierre-Yves Chibon |
9c6dee |
ci_password=jenk_project.ci_hook.ci_password,
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
abb591 |
|
|
Pierre-Yves Chibon |
abb591 |
else:
|
|
Pierre-Yves Chibon |
9c2953 |
_log.warning("Pagure-CI:Un-supported CI type")
|
|
Pierre-Yves Chibon |
abb591 |
|
|
Pierre-Yves Chibon |
9c2953 |
_log.info("Pagure-CI: Ready for another")
|