2017-12-19 17:03:51 +01:00
|
|
|
import json
|
|
|
|
import requests
|
2018-03-10 22:46:33 +01:00
|
|
|
import datetime
|
2017-12-19 17:03:51 +01:00
|
|
|
|
2018-01-29 03:39:04 +01:00
|
|
|
from .. import db
|
2018-11-05 17:17:03 +01:00
|
|
|
from app.models.applists import App
|
2017-12-19 17:03:51 +01:00
|
|
|
|
|
|
|
class AppCIBranch(db.Model):
|
|
|
|
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
|
|
name = db.Column(db.String(64), unique=True, nullable=False)
|
2018-11-02 01:30:50 +01:00
|
|
|
arch = db.Column(db.String(64), nullable=False)
|
|
|
|
branch = db.Column(db.String(64), nullable=False)
|
2017-12-19 17:03:51 +01:00
|
|
|
display_name = db.Column(db.String(64), unique=True, nullable=False)
|
|
|
|
url = db.Column(db.String(128), nullable=False)
|
|
|
|
console_uri = db.Column(db.String(128), nullable=False)
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return '<AppCIBranch %r>' % self.name
|
|
|
|
|
|
|
|
def init():
|
|
|
|
yield AppCIBranch(name='stable',
|
2018-11-02 01:30:50 +01:00
|
|
|
arch="x86",
|
|
|
|
branch="stable",
|
2017-12-19 17:03:51 +01:00
|
|
|
display_name='Stable (x86)',
|
2018-11-02 01:30:50 +01:00
|
|
|
url='https://ci-apps.yunohost.org/ci/logs/list_level_stable.json',
|
2017-12-19 17:03:51 +01:00
|
|
|
console_uri='/job/{} ({})/lastBuild/consoleText')
|
|
|
|
|
|
|
|
yield AppCIBranch(name='arm',
|
2018-11-02 01:30:50 +01:00
|
|
|
arch="arm",
|
|
|
|
branch="stable",
|
2017-12-19 17:03:51 +01:00
|
|
|
display_name='Stable (ARM)',
|
2018-11-02 01:30:50 +01:00
|
|
|
url='https://ci-apps-arm.yunohost.org/ci/logs/list_level_stable.json',
|
2017-12-19 17:03:51 +01:00
|
|
|
console_uri='/job/{} ({}) (~ARM~)/lastBuild/consoleText')
|
|
|
|
|
|
|
|
def last_build_url(self, app):
|
|
|
|
return self.url + self.console_uri.format(app.name, app.list.name.title())
|
|
|
|
|
|
|
|
def most_recent_tests_per_app(self):
|
|
|
|
|
2018-11-05 16:58:15 +01:00
|
|
|
apps = App.query.filter_by(ci_enabled=True).all()
|
2017-12-19 17:03:51 +01:00
|
|
|
for app in apps:
|
|
|
|
most_recent_test = AppCIResult.query \
|
2018-11-02 01:30:50 +01:00
|
|
|
.filter_by(branch = self) \
|
|
|
|
.filter_by(app = app) \
|
|
|
|
.order_by('date desc') \
|
|
|
|
.first()
|
2017-12-19 17:03:51 +01:00
|
|
|
if most_recent_test:
|
|
|
|
yield most_recent_test
|
2018-11-02 02:07:16 +01:00
|
|
|
else:
|
|
|
|
yield AppCIResult(app = app,
|
|
|
|
branch = self,
|
|
|
|
level = None,
|
|
|
|
date = datetime.datetime.fromtimestamp(0),
|
|
|
|
results = [ None for t in AppCI.tests ])
|
2017-12-19 17:03:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
class AppCIResult(db.Model):
|
|
|
|
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
|
|
|
|
|
|
app = db.relationship(App, backref='tests', lazy=True, uselist=False)
|
|
|
|
branch = db.relationship(AppCIBranch, backref='tests', lazy=True, uselist=False)
|
|
|
|
|
|
|
|
app_id = db.Column(db.ForeignKey(App.id))
|
|
|
|
branch_id = db.Column(db.ForeignKey(AppCIBranch.id))
|
|
|
|
|
|
|
|
results = db.Column(db.PickleType)
|
|
|
|
|
2018-02-26 14:46:51 +01:00
|
|
|
date = db.Column(db.DateTime, nullable=True)
|
|
|
|
level = db.Column(db.Integer, nullable=True)
|
2018-11-02 01:30:50 +01:00
|
|
|
url = db.Column(db.String(128), nullable=True)
|
2018-02-26 14:46:51 +01:00
|
|
|
commit = db.Column(db.String(64), nullable=True)
|
2017-12-19 17:03:51 +01:00
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return '<AppTestResults %s>' % self.date
|
|
|
|
|
|
|
|
def init():
|
|
|
|
pass
|
|
|
|
|
|
|
|
def score(self):
|
|
|
|
s_dict = { True: +1, False: -1, None: 0 }
|
2018-11-02 02:07:16 +01:00
|
|
|
return sum([ s_dict[result] for result in self.results ])
|
2017-12-19 17:03:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
class AppCI():
|
|
|
|
|
|
|
|
tests = [ "Package linter",
|
|
|
|
"Installation",
|
|
|
|
"Deleting",
|
|
|
|
"Upgrade",
|
|
|
|
"Backup",
|
|
|
|
"Restore",
|
|
|
|
"Change URL",
|
|
|
|
"Installation in a sub path",
|
|
|
|
"Deleting from a sub path",
|
|
|
|
"Installation on the root",
|
|
|
|
"Deleting from root",
|
|
|
|
"Installation in private mode",
|
|
|
|
"Installation in public mode",
|
|
|
|
"Multi-instance installations",
|
|
|
|
"Malformed path",
|
|
|
|
"Port already used" ]
|
|
|
|
|
|
|
|
def update():
|
|
|
|
|
|
|
|
cibranches = AppCIBranch.query.all()
|
|
|
|
|
2018-11-02 01:30:50 +01:00
|
|
|
def symbol_to_bool(s):
|
|
|
|
return bool(int(s)) if s in [ "1", "0" ] else None
|
|
|
|
|
2017-12-19 17:03:51 +01:00
|
|
|
# Scrap jenkins
|
2018-11-02 01:30:50 +01:00
|
|
|
for cibranch in cibranches:
|
|
|
|
print("> Fetching current CI results for C.I. branch {}".format(cibranch.name))
|
|
|
|
result_json = requests.get(cibranch.url).text
|
|
|
|
cleaned_json = [ line for line in result_json.split("\n") if "test_name" in line ]
|
|
|
|
cleaned_json = [ line.replace('"level": ?,', '"level": null,') for line in cleaned_json ]
|
|
|
|
cleaned_json = "[" + ''.join(cleaned_json)[:-1] + "]"
|
|
|
|
j = json.loads(cleaned_json)
|
|
|
|
for test_summary in j:
|
|
|
|
if (test_summary["arch"], test_summary["branch"]) != (cibranch.arch, cibranch.branch):
|
2017-12-19 17:03:51 +01:00
|
|
|
continue
|
2018-11-02 01:30:50 +01:00
|
|
|
|
|
|
|
results = AppCIResult(app = App.query.filter_by(name=test_summary["app"]).first(),
|
|
|
|
branch = cibranch,
|
|
|
|
level = test_summary["level"],
|
|
|
|
date = datetime.datetime.fromtimestamp(test_summary["timestamp"]),
|
|
|
|
results = [ symbol_to_bool(s) for s in test_summary["detailled_success"] ])
|
2017-12-19 17:03:51 +01:00
|
|
|
db.session.add(results)
|
|
|
|
|
|
|
|
db.session.commit()
|