mirror of
https://github.com/YunoHost/tartiflette.git
synced 2024-09-03 20:06:08 +02:00
More big reworking for the appci
This commit is contained in:
parent
38c36a0361
commit
a2766028df
14 changed files with 346 additions and 394 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,4 +1,5 @@
|
||||||
*.json
|
*.json
|
||||||
|
*.pyc
|
||||||
www
|
www
|
||||||
token
|
token
|
||||||
pullrequests/data/
|
pullrequests/data/
|
||||||
|
|
26
appci/common.py
Normal file
26
appci/common.py
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
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" ]
|
||||||
|
|
||||||
|
ci_branches = [ ("stable", "Stable (x86)"),
|
||||||
|
("arm", "Stable (ARM)"),
|
||||||
|
("testing", "Testing"),
|
||||||
|
("unstable", "Unstable") ]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
python fetchlist.py | sort > list_apps
|
|
||||||
|
|
||||||
while read APP;
|
|
||||||
do
|
|
||||||
APPNAME=$(echo $APP | awk '{print $1}')
|
|
||||||
echo $APPNAME
|
|
||||||
wget -q -O data/$APPNAME "https://ci-apps.yunohost.org/jenkins/job/$APP/lastBuild/consoleText" --prefer-family=IPv4
|
|
||||||
|
|
||||||
TESTS_RESULTS=""
|
|
||||||
while read TESTNAME
|
|
||||||
do
|
|
||||||
RESULTS=$(grep "^$TESTNAME:" data/$APPNAME)
|
|
||||||
if echo $RESULTS | grep -q "FAIL"
|
|
||||||
then
|
|
||||||
TESTS_RESULTS="${TESTS_RESULTS}0"
|
|
||||||
elif echo $RESULTS | grep -q "SUCCESS"
|
|
||||||
then
|
|
||||||
TESTS_RESULTS="${TESTS_RESULTS}1"
|
|
||||||
else
|
|
||||||
TESTS_RESULTS="${TESTS_RESULTS}X"
|
|
||||||
fi
|
|
||||||
done < list_tests
|
|
||||||
|
|
||||||
# Get the level of this application and the value of each level
|
|
||||||
LEVELS=$(grep -A10 'Level of this application' data/$APPNAME \
|
|
||||||
| tail -n11 \
|
|
||||||
| sed 's/.*: \| (.*//g' \
|
|
||||||
| sed 's@N/A@X@g' \
|
|
||||||
| tr -d '\n')
|
|
||||||
|
|
||||||
# LEVELS=$(grep -A10 'Level of this application' data/$APPNAME \
|
|
||||||
# | tail -n 11 \
|
|
||||||
# | sed -e 's@N/A@X@g' -e 's/ Level //g' -e 's/Level of this application//g' \
|
|
||||||
# | awk '{print $2}' \
|
|
||||||
# | tr -d '\n')
|
|
||||||
|
|
||||||
echo $TESTS_RESULTS > data/$APPNAME
|
|
||||||
echo $LEVELS >> data/$APPNAME
|
|
||||||
|
|
||||||
done < list_apps
|
|
||||||
|
|
|
@ -1,48 +1,18 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python2.7
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import json
|
import glob
|
||||||
|
from publish_apps import main as publish_apps
|
||||||
|
from publish_branches import main as publish_branches
|
||||||
|
|
||||||
from jinja2 import Template
|
def main():
|
||||||
from ansi2html import Ansi2HTMLConverter
|
for link in glob.glob("../www/integration/*.svg"):
|
||||||
from ansi2html.style import get_styles
|
os.unlink(link);
|
||||||
|
os.symlink("%s/badges/unknown.svg" % os.getcwd(),
|
||||||
|
"../www/integration/unknown.svg")
|
||||||
|
|
||||||
###############################################################################
|
publish_branches()
|
||||||
|
publish_apps()
|
||||||
output_dir = "../www/"
|
|
||||||
|
|
||||||
template_path = os.path.join(output_dir,"template_appci.html")
|
|
||||||
output_path = os.path.join(output_dir,"appci.html")
|
|
||||||
|
|
||||||
summary_path = os.path.join("./", "summary.json")
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
conv = Ansi2HTMLConverter()
|
|
||||||
shell_css = "\n".join(map(str, get_styles(conv.dark_bg, conv.scheme)))
|
|
||||||
|
|
||||||
def shell_to_html(shell):
|
|
||||||
return conv.convert(shell, False)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
||||||
# Fetch the list of all reports, sorted in reverse-chronological order
|
|
||||||
|
|
||||||
#summary = json.load(open(summary_path))
|
|
||||||
|
|
||||||
summary = {}
|
|
||||||
summary["testnames"] = open("list_tests").read().strip().split('\n')
|
|
||||||
summary["apps"] = json.loads(open("apps.json").read())
|
|
||||||
|
|
||||||
# Generate the output using the template
|
|
||||||
|
|
||||||
template = open(template_path, "r").read()
|
|
||||||
t = Template(template)
|
|
||||||
|
|
||||||
result = t.render(data=summary, convert=shell_to_html, shell_css=shell_css)
|
|
||||||
|
|
||||||
open(output_path, "w").write(result)
|
|
||||||
|
|
||||||
print("Done.")
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python2.7
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
|
@ -7,34 +7,12 @@ import glob
|
||||||
from jinja2 import Template
|
from jinja2 import Template
|
||||||
from ansi2html import Ansi2HTMLConverter
|
from ansi2html import Ansi2HTMLConverter
|
||||||
from ansi2html.style import get_styles
|
from ansi2html.style import get_styles
|
||||||
|
from common import tests, ci_branches
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
output_dir = "../www/"
|
output_dir = "../www/"
|
||||||
|
template_path = "./templates/app.html"
|
||||||
template_path = os.path.join(output_dir,"template_appci_perapp.html")
|
|
||||||
|
|
||||||
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" ]
|
|
||||||
|
|
||||||
ci_branches = [ ("stable", "Stable (x86)"),
|
|
||||||
("arm", "Stable (ARM)"),
|
|
||||||
("testing", "Testing"),
|
|
||||||
("unstable", "Unstable") ]
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
@ -46,7 +24,7 @@ def shell_to_html(shell):
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
if __name__ == '__main__':
|
def main():
|
||||||
|
|
||||||
# Load the template
|
# Load the template
|
||||||
template = open(template_path, "r").read()
|
template = open(template_path, "r").read()
|
||||||
|
@ -56,19 +34,28 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
for app in apps:
|
for app in apps:
|
||||||
|
|
||||||
print app
|
results = json.loads(open("data/" + app).read())
|
||||||
|
|
||||||
|
# Meh
|
||||||
|
try:
|
||||||
|
level = "level" + str(int(results["stable"]["level"]))
|
||||||
|
except:
|
||||||
|
level = "unknown"
|
||||||
|
|
||||||
|
os.symlink("%s/badges/%s.svg" % (os.getcwd(), level),
|
||||||
|
"../www/integration/%s.svg" % app)
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
"appname": app,
|
"appname": app,
|
||||||
"ci_branches": ci_branches,
|
"ci_branches": ci_branches,
|
||||||
"tests": tests,
|
"tests": tests,
|
||||||
"results": json.loads(open("data/" + app).read()),
|
"results": results,
|
||||||
"result_to_class": { None:"unknown", False:"danger", True:"success" }
|
"result_to_class": { None:"unknown", False:"danger", True:"success" }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Generate the output using the template
|
# Generate the output using the template
|
||||||
result = t.render(data=data, convert=shell_to_html, shell_css=shell_css)
|
result = t.render(data=data, convert=shell_to_html, shell_css=shell_css)
|
||||||
|
|
||||||
output_path = os.path.join(output_dir,"ciperapp", "%s.html" % app)
|
output_path = os.path.join(output_dir, "appci", "app", "%s.html" % app)
|
||||||
open(output_path, "w").write(result)
|
open(output_path, "w").write(result)
|
||||||
|
|
|
@ -1,111 +0,0 @@
|
||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
import os
|
|
||||||
import json
|
|
||||||
import glob
|
|
||||||
|
|
||||||
from jinja2 import Template
|
|
||||||
from ansi2html import Ansi2HTMLConverter
|
|
||||||
from ansi2html.style import get_styles
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
output_dir = "../www/"
|
|
||||||
|
|
||||||
template_path = os.path.join(output_dir,"template_appci_branch.html")
|
|
||||||
|
|
||||||
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" ]
|
|
||||||
|
|
||||||
ci_branches = [ ("stable", "Stable (x86)"),
|
|
||||||
("arm", "Stable (ARM)"),
|
|
||||||
("testing", "Testing"),
|
|
||||||
("unstable", "Unstable") ]
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
conv = Ansi2HTMLConverter()
|
|
||||||
shell_css = "\n".join(map(str, get_styles(conv.dark_bg, conv.scheme)))
|
|
||||||
|
|
||||||
def shell_to_html(shell):
|
|
||||||
return conv.convert(shell, False)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
|
|
||||||
# Load the template
|
|
||||||
template = open(template_path, "r").read()
|
|
||||||
t = Template(template)
|
|
||||||
|
|
||||||
apps = [ file_.replace("data/", "") for file_ in glob.glob("data/*") ]
|
|
||||||
|
|
||||||
branch = ci_branches[0]
|
|
||||||
branch_id = branch[0]
|
|
||||||
|
|
||||||
data = { "ci_branch": branch,
|
|
||||||
"tests": tests,
|
|
||||||
"result_to_class": { None: "unknown",
|
|
||||||
False: "danger",
|
|
||||||
True: "success" }
|
|
||||||
}
|
|
||||||
|
|
||||||
data["apps"] = []
|
|
||||||
for app in apps:
|
|
||||||
data["apps"].append((app, json.loads(open("data/" + app).read())[branch_id]))
|
|
||||||
|
|
||||||
# Sort apps according to level, number of successfull test, name
|
|
||||||
def level(app):
|
|
||||||
test_results = app[1]
|
|
||||||
if not test_results:
|
|
||||||
return -1
|
|
||||||
if "level" in test_results and test_results["level"]:
|
|
||||||
return test_results["level"]
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def test_score(app):
|
|
||||||
test_results = app[1]
|
|
||||||
if not test_results or "tests" not in test_results:
|
|
||||||
return -1
|
|
||||||
|
|
||||||
score = 0
|
|
||||||
for test, r in test_results["tests"].items():
|
|
||||||
if r == True:
|
|
||||||
score += 1
|
|
||||||
elif r == False:
|
|
||||||
score -= 1
|
|
||||||
return score
|
|
||||||
|
|
||||||
data["apps"] = sorted(data["apps"], key=lambda a: (-level(a), -test_score(a)))
|
|
||||||
#, lambda app,T: (T["level"],
|
|
||||||
# len([ t for t in T["tests"].values if t == True ]),
|
|
||||||
# app))
|
|
||||||
|
|
||||||
summary_per_level = []
|
|
||||||
summary_per_level.append(("Untested", len([ a for a in data["apps"] if level(a) == -1 ])))
|
|
||||||
for l in range(0, 8):
|
|
||||||
summary_per_level.append(("Level %s" % l, len([ a for a in data["apps"] if level(a) == l ])))
|
|
||||||
data["summary_per_level"] = summary_per_level
|
|
||||||
|
|
||||||
# Generate the output using the template
|
|
||||||
result = t.render(data=data, convert=shell_to_html, shell_css=shell_css)
|
|
||||||
|
|
||||||
output_path = os.path.join(output_dir, "appci_%s.html" % branch_id)
|
|
||||||
open(output_path, "w").write(result)
|
|
||||||
|
|
||||||
print "Done."
|
|
||||||
|
|
69
appci/publish_branch_comparison.py
Executable file
69
appci/publish_branch_comparison.py
Executable file
|
@ -0,0 +1,69 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import glob
|
||||||
|
|
||||||
|
from jinja2 import Template
|
||||||
|
from ansi2html import Ansi2HTMLConverter
|
||||||
|
from ansi2html.style import get_styles
|
||||||
|
|
||||||
|
from common import tests, ci_branches
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
output_dir = "../www/"
|
||||||
|
|
||||||
|
template_path = "./templates/branch_compare.html"
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
conv = Ansi2HTMLConverter()
|
||||||
|
shell_css = "\n".join(map(str, get_styles(conv.dark_bg, conv.scheme)))
|
||||||
|
|
||||||
|
def shell_to_html(shell):
|
||||||
|
return conv.convert(shell, False)
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
# Load the template
|
||||||
|
template = open(template_path, "r").read()
|
||||||
|
t = Template(template)
|
||||||
|
|
||||||
|
apps = [ file_.replace("data/", "") for file_ in glob.glob("data/*") ]
|
||||||
|
|
||||||
|
data = { "ci_branches": ci_branches,
|
||||||
|
}
|
||||||
|
|
||||||
|
# Sort apps according to level, number of successfull test, name
|
||||||
|
def level(test_results):
|
||||||
|
if not test_results:
|
||||||
|
return -1
|
||||||
|
if "level" in test_results and test_results["level"]:
|
||||||
|
return test_results["level"]
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def compare_levels(a, b):
|
||||||
|
if a > b:
|
||||||
|
return '+'
|
||||||
|
if a < b:
|
||||||
|
return '-'
|
||||||
|
else:
|
||||||
|
return '='
|
||||||
|
|
||||||
|
data["apps"] = []
|
||||||
|
for app in apps:
|
||||||
|
all_test_results = json.loads(open("data/" + app).read())
|
||||||
|
all_levels = [ level(all_test_results[ci_branch]) for ci_branch, _ in ci_branches ]
|
||||||
|
data["apps"].append((app, all_levels))
|
||||||
|
|
||||||
|
data["apps"] = sorted(data["apps"], key=lambda a: -a[1][0])
|
||||||
|
|
||||||
|
# Generate the output using the template
|
||||||
|
result = t.render(data=data, convert=shell_to_html, shell_css=shell_css)
|
||||||
|
|
||||||
|
output_path = os.path.join(output_dir, "appci_branch_compare.html")
|
||||||
|
open(output_path, "w").write(result)
|
||||||
|
|
87
appci/publish_branches.py
Executable file
87
appci/publish_branches.py
Executable file
|
@ -0,0 +1,87 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import glob
|
||||||
|
|
||||||
|
from jinja2 import Template
|
||||||
|
from ansi2html import Ansi2HTMLConverter
|
||||||
|
from ansi2html.style import get_styles
|
||||||
|
|
||||||
|
from common import tests, ci_branches
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
output_dir = "../www/"
|
||||||
|
|
||||||
|
template_path = "./templates/branch.html"
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
conv = Ansi2HTMLConverter()
|
||||||
|
shell_css = "\n".join(map(str, get_styles(conv.dark_bg, conv.scheme)))
|
||||||
|
|
||||||
|
def shell_to_html(shell):
|
||||||
|
return conv.convert(shell, False)
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
# Load the template
|
||||||
|
template = open(template_path, "r").read()
|
||||||
|
t = Template(template)
|
||||||
|
|
||||||
|
apps = [ file_.replace("data/", "") for file_ in glob.glob("data/*") ]
|
||||||
|
|
||||||
|
for branch in ci_branches:
|
||||||
|
branch_id = branch[0]
|
||||||
|
|
||||||
|
data = { "ci_branch": branch,
|
||||||
|
"tests": tests,
|
||||||
|
"result_to_class": { None: "unknown",
|
||||||
|
False: "danger",
|
||||||
|
True: "success" }
|
||||||
|
}
|
||||||
|
|
||||||
|
data["apps"] = []
|
||||||
|
for app in apps:
|
||||||
|
data["apps"].append((app, json.loads(open("data/" + app).read())[branch_id]))
|
||||||
|
|
||||||
|
# Sort apps according to level, number of successfull test, name
|
||||||
|
def level(app):
|
||||||
|
test_results = app[1]
|
||||||
|
if not test_results:
|
||||||
|
return -2
|
||||||
|
if "level" in test_results:
|
||||||
|
l = test_results["level"]
|
||||||
|
return l if not l is None else -1
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def test_score(app):
|
||||||
|
test_results = app[1]
|
||||||
|
if not test_results or "tests" not in test_results:
|
||||||
|
return -1
|
||||||
|
|
||||||
|
score = 0
|
||||||
|
for test, r in test_results["tests"].items():
|
||||||
|
if r == True:
|
||||||
|
score += 1
|
||||||
|
elif r == False:
|
||||||
|
score -= 1
|
||||||
|
return score
|
||||||
|
|
||||||
|
data["apps"] = sorted(data["apps"], key=lambda a: (-level(a), -test_score(a)))
|
||||||
|
|
||||||
|
summary_per_level = []
|
||||||
|
summary_per_level.append(("Untested", len([ a for a in data["apps"] if level(a) == -1 ])))
|
||||||
|
for l in range(0, 8):
|
||||||
|
summary_per_level.append(("Level %s" % l, len([ a for a in data["apps"] if level(a) == l ])))
|
||||||
|
data["summary_per_level"] = summary_per_level
|
||||||
|
|
||||||
|
# Generate the output using the template
|
||||||
|
result = t.render(data=data, convert=shell_to_html, shell_css=shell_css)
|
||||||
|
|
||||||
|
output_path = os.path.join(output_dir, "appci", "branch", "%s.html" % branch_id)
|
||||||
|
open(output_path, "w").write(result)
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
<title>Apps CI Dashboard</title>
|
<title>Apps CI Dashboard</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<link rel="stylesheet" href="../css/bootstrap.css" media="screen">
|
<link rel="stylesheet" href="../../css/bootstrap.css" media="screen">
|
||||||
<link rel="stylesheet" href="../skins/eden.css" media="screen">
|
<link rel="stylesheet" href="../../skins/eden.css" media="screen">
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
#app-test-results
|
#app-test-results
|
||||||
|
@ -67,8 +67,6 @@
|
||||||
<body>
|
<body>
|
||||||
<div class="bs-docs-section">
|
<div class="bs-docs-section">
|
||||||
|
|
||||||
<div id="levelSummary" style="height: 270px; width: 100%;"></div>
|
|
||||||
|
|
||||||
<div class="row text-center">
|
<div class="row text-center">
|
||||||
<h2>{{ data.appname }}</h2>
|
<h2>{{ data.appname }}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
@ -90,7 +88,7 @@
|
||||||
<tr id="ci-branch-{{ ci_branch_id }}">
|
<tr id="ci-branch-{{ ci_branch_id }}">
|
||||||
<td class="ci-branch-name"><div title="CI Branch"><strong>{{ ci_branch_name }}</strong></div></td>
|
<td class="ci-branch-name"><div title="CI Branch"><strong>{{ ci_branch_name }}</strong></div></td>
|
||||||
{% if data.results[ci_branch_id] %}
|
{% if data.results[ci_branch_id] %}
|
||||||
<td><div title="Level"><strong>{{ data.results[ci_branch_id]["level"] or '?' }}</strong></div></td>
|
<td><div title="Level"><strong>{{ data.results[ci_branch_id]["level"] }}</strong></div></td>
|
||||||
{% for test in data.tests %}
|
{% for test in data.tests %}
|
||||||
<td class="ci-test-result">
|
<td class="ci-test-result">
|
||||||
<div title="{{ test }}" class="{{ data.result_to_class[data.results[ci_branch_id]["tests"][test]] }}"></div>
|
<div title="{{ test }}" class="{{ data.result_to_class[data.results[ci_branch_id]["tests"][test]] }}"></div>
|
||||||
|
@ -111,39 +109,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="../js/jquery-2.1.3.min.js"></script>
|
<script src="../../js/jquery-2.1.3.min.js"></script>
|
||||||
<script src="../js/bootstrap.min.js"></script>
|
<script src="../../js/bootstrap.min.js"></script>
|
||||||
<script src="../js/canvasjs.min.js"></script>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
window.onload = function () {
|
|
||||||
|
|
||||||
var chart = new CanvasJS.Chart("levelSummary", {
|
|
||||||
animationEnabled: true,
|
|
||||||
data: [{
|
|
||||||
type: "doughnut",
|
|
||||||
startAngle: -90,
|
|
||||||
//innerRadius: 60,
|
|
||||||
indexLabelFontSize: 17,
|
|
||||||
indexLabel: "{label} - #percent%",
|
|
||||||
toolTipContent: "<b>{label}:</b> {y} (#percent%)",
|
|
||||||
dataPoints: [
|
|
||||||
{ y: 100, label: "Untested", color: "#aaaaaa" },
|
|
||||||
{ y: 200, label: "Level 0", color: "#d9534f" },
|
|
||||||
{ y: 200, label: "Level 1", color: "#E26D4F" },
|
|
||||||
{ y: 100, label: "Level 2", color: "#E98D4E" },
|
|
||||||
{ y: 100, label: "Level 3", color: "#f0ad4e" },
|
|
||||||
{ y: 40, label: "Level 4", color: "#CBB052" },
|
|
||||||
{ y: 60, label: "Level 5", color: "#A6B255" },
|
|
||||||
{ y: 50, label: "Level 6", color: "#7AB659" },
|
|
||||||
{ y: 150, label: "Level 7", color: "#5cb85c" }
|
|
||||||
]
|
|
||||||
}]
|
|
||||||
});
|
|
||||||
chart.render();
|
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -6,8 +6,8 @@
|
||||||
<title>Apps CI Dashboard</title>
|
<title>Apps CI Dashboard</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<link rel="stylesheet" href="css/bootstrap.css" media="screen">
|
<link rel="stylesheet" href="../../css/bootstrap.css" media="screen">
|
||||||
<link rel="stylesheet" href="skins/eden.css" media="screen">
|
<link rel="stylesheet" href="../../skins/eden.css" media="screen">
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
#app-test-results
|
#app-test-results
|
||||||
|
@ -69,7 +69,7 @@
|
||||||
|
|
||||||
<div class="row text-center">
|
<div class="row text-center">
|
||||||
<h2>{{ data.ci_branch[1] }}</h2>
|
<h2>{{ data.ci_branch[1] }}</h2>
|
||||||
<div id="levelSummary" style="height: 270px; width: 100%;"></div>
|
<div id="levelSummary" style="height: 270px;" class="col-sm-6 col-sm-offset-3"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -88,9 +88,9 @@
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for app, test_results in data.apps %}
|
{% for app, test_results in data.apps %}
|
||||||
<tr id="ci-app-{{ app }}">
|
<tr id="ci-app-{{ app }}">
|
||||||
<td class="ci-app-name"><div title="App"><strong>{{ app }}</strong></div></td>
|
<td class="ci-app-name"><a href="../app/{{ app }}.html"><div title="App"><strong>{{ app }}</strong></div></a></td>
|
||||||
{% if test_results %}
|
{% if test_results %}
|
||||||
<td><div title="Level"><strong>{{ test_results["level"] or '?' }}</strong></div></td>
|
<td><div title="Level"><strong>{{ '?' if test_results["level"] == None else test_results["level"] }}</strong></div></td>
|
||||||
{% for test in data.tests %}
|
{% for test in data.tests %}
|
||||||
<td class="ci-test-result">
|
<td class="ci-test-result">
|
||||||
<div title="{{ test }}" class="{{ data.result_to_class[test_results["tests"][test]] }}"></div>
|
<div title="{{ test }}" class="{{ data.result_to_class[test_results["tests"][test]] }}"></div>
|
||||||
|
@ -110,15 +110,15 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="js/jquery-2.1.3.min.js"></script>
|
<script src="../../js/jquery-2.1.3.min.js"></script>
|
||||||
<script src="js/bootstrap.min.js"></script>
|
<script src="../../js/bootstrap.min.js"></script>
|
||||||
<script src="js/canvasjs.min.js"></script>
|
<script src="../../js/canvasjs.min.js"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
window.onload = function () {
|
window.onload = function () {
|
||||||
|
|
||||||
var chart = new CanvasJS.Chart("levelSummary", {
|
var chart = new CanvasJS.Chart("levelSummary", {
|
||||||
animationEnabled: true,
|
animationEnabled: false,
|
||||||
data: [{
|
data: [{
|
||||||
type: "doughnut",
|
type: "doughnut",
|
||||||
startAngle: -90,
|
startAngle: -90,
|
||||||
|
@ -127,7 +127,7 @@ var chart = new CanvasJS.Chart("levelSummary", {
|
||||||
indexLabel: "{label} - #percent%",
|
indexLabel: "{label} - #percent%",
|
||||||
toolTipContent: "<b>{label}:</b> {y} (#percent%)",
|
toolTipContent: "<b>{label}:</b> {y} (#percent%)",
|
||||||
dataPoints: [
|
dataPoints: [
|
||||||
{ y: {{ data.summary_per_level[0] }}, label: "Untested", color: "#cccccc" },
|
{ y: {{ data.summary_per_level[0] }}, label: "Unknown", color: "#cccccc" },
|
||||||
{ y: {{ data.summary_per_level[1] }}, label: "Level 0", color: "#d9534f" },
|
{ y: {{ data.summary_per_level[1] }}, label: "Level 0", color: "#d9534f" },
|
||||||
{ y: {{ data.summary_per_level[2] }}, label: "Level 1", color: "#E26D4F" },
|
{ y: {{ data.summary_per_level[2] }}, label: "Level 1", color: "#E26D4F" },
|
||||||
{ y: {{ data.summary_per_level[3] }}, label: "Level 2", color: "#E98D4E" },
|
{ y: {{ data.summary_per_level[3] }}, label: "Level 2", color: "#E98D4E" },
|
111
appci/templates/branch_compare.html
Normal file
111
appci/templates/branch_compare.html
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Apps CI Dashboard</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<link rel="stylesheet" href="css/bootstrap.css" media="screen">
|
||||||
|
<link rel="stylesheet" href="skins/eden.css" media="screen">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#app-test-results
|
||||||
|
{
|
||||||
|
margin-left:auto;
|
||||||
|
margin-right:auto;
|
||||||
|
/*width:1000px;*/
|
||||||
|
}
|
||||||
|
.navbar-holder-dark {
|
||||||
|
padding: 20px 20px 200px 20px;
|
||||||
|
background: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
table, thead, tbody { display: block; width: 100%;}
|
||||||
|
table.apps { margin: 0 auto; margin-top: 100px; width: 350px; overflow-x: visible; }
|
||||||
|
|
||||||
|
th.ci-test-title
|
||||||
|
{
|
||||||
|
margin:5px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
th.ci-test-title > div
|
||||||
|
{
|
||||||
|
position:relative;
|
||||||
|
transform:
|
||||||
|
translate(0px, -10px)
|
||||||
|
rotate(315deg);
|
||||||
|
width: 33px;
|
||||||
|
}
|
||||||
|
|
||||||
|
th.ci-test-title > div > span
|
||||||
|
{
|
||||||
|
border-bottom: 1px solid #aaa;
|
||||||
|
padding: 0;
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*tr { display: block; width: 100%; }*/
|
||||||
|
th, td { display: block; border: none; padding; 0px;float: left; height:33px; width: 33px; margin: 5px; }
|
||||||
|
|
||||||
|
th.ci-app-name, td.ci-app-name { text-align: center; width:130px; padding-top:9px !important; }
|
||||||
|
td.ci-test-result > div { position:relative; background-color: #bdc3c7; border-radius:5px; width: 100%; height:100%;}
|
||||||
|
td.ci-test-result { text-align:center; }
|
||||||
|
|
||||||
|
td.ci-test-result > div.success { background-color: rgb(46,204,113); }
|
||||||
|
td.ci-test-result > div.danger { background-color: rgb(225,80,62); }
|
||||||
|
|
||||||
|
.table > thead > tr > th { border : none; }
|
||||||
|
.table > tbody > tr > td { border : none; }
|
||||||
|
|
||||||
|
.canvasjs-chart-credit { display: none; }
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="bs-docs-section">
|
||||||
|
|
||||||
|
<div class="row text-center">
|
||||||
|
<h2>Branch comparison</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div id="app-test-results">
|
||||||
|
<div>
|
||||||
|
<table class="table table-responsive apps">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="ci-app-name"><div></div></th>
|
||||||
|
{% for branch_id, branch_name in data.ci_branches %}
|
||||||
|
<th class="ci-test-title"><div>{{ branch_name }}</div></th>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for app, test_results in data.apps %}
|
||||||
|
<tr id="ci-app-{{ app }}">
|
||||||
|
<td class="ci-app-name"><div title="App"><strong>{{ app }}</strong></div></td>
|
||||||
|
{% for branch_level in test_results %}
|
||||||
|
<td><div title="Level"><strong>{{ branch_level }}</strong></div></td>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="js/jquery-2.1.3.min.js"></script>
|
||||||
|
<script src="js/bootstrap.min.js"></script>
|
||||||
|
<script src="js/canvasjs.min.js"></script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
0
www/appci/app/.gitkeep
Normal file
0
www/appci/app/.gitkeep
Normal file
0
www/appci/branch/.gitkeep
Normal file
0
www/appci/branch/.gitkeep
Normal file
|
@ -1,112 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>Apps CI Dashboard</title>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<link rel="stylesheet" href="css/bootstrap.css" media="screen">
|
|
||||||
<link rel="stylesheet" href="skins/eden.css" media="screen">
|
|
||||||
<!--<link
|
|
||||||
href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"
|
|
||||||
rel="stylesheet">-->
|
|
||||||
<link href="css/animate.css" rel="stylesheet">
|
|
||||||
|
|
||||||
<style>
|
|
||||||
#appci
|
|
||||||
{
|
|
||||||
margin-left:auto;
|
|
||||||
margin-right:auto;
|
|
||||||
/*width:1000px;*/
|
|
||||||
}
|
|
||||||
.navbar-holder-dark{
|
|
||||||
padding: 20px 20px 200px 20px;
|
|
||||||
background: #333333;
|
|
||||||
}
|
|
||||||
|
|
||||||
table, thead, tbody { display: block; width: 100%;}
|
|
||||||
table.apps { margin: 0 auto; margin-top: 200px; width: 1000px; overflow-x: visible; }
|
|
||||||
|
|
||||||
th.testname
|
|
||||||
{
|
|
||||||
margin:5px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
th.testname > div
|
|
||||||
{
|
|
||||||
position:relative;
|
|
||||||
transform:
|
|
||||||
translate(0px, -10px)
|
|
||||||
rotate(315deg);
|
|
||||||
width: 33px;
|
|
||||||
}
|
|
||||||
|
|
||||||
th.testname > div > span
|
|
||||||
{
|
|
||||||
border-bottom: 1px solid #aaa;
|
|
||||||
padding: 0;
|
|
||||||
border:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*tr { display: block; width: 100%; }*/
|
|
||||||
th, td { display: block; border: none; padding; 0px;float: left; height:33px; width: 33px; margin: 5px; }
|
|
||||||
|
|
||||||
th.appname, td.appname { text-align: center; width:130px; padding-top:9px !important; }
|
|
||||||
td.appstatus > div { position:relative; background-color: #bdc3c7; border-radius:5px; width: 100%; height:100%;}
|
|
||||||
td.appstatus { text-align:center; }
|
|
||||||
|
|
||||||
td.appstatus > div.success { background-color: rgb(46,204,113); }
|
|
||||||
td.appstatus > div.danger { background-color: rgb(225,80,62); }
|
|
||||||
|
|
||||||
.table > thead > tr > th { border : none; }
|
|
||||||
.table > tbody > tr > td { border : none; }
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<!-- Tables
|
|
||||||
================================================== -->
|
|
||||||
<div class="bs-docs-section">
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div id="appci">
|
|
||||||
<div>
|
|
||||||
<table class="table table-responsive apps">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th class="appname"><div></div></th>
|
|
||||||
<th class="testname"><div>Level</div></th>
|
|
||||||
{% for testname in data.testnames %}
|
|
||||||
<th class="testname"><div><span>{{ testname }}</span></div></th>
|
|
||||||
{% endfor %}
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for app in data.apps %}
|
|
||||||
<tr id="{{ app.name }}">
|
|
||||||
<td class="appname"><div title="App name"><strong>{{ app.name }}</strong></div></td>
|
|
||||||
<td class="applevel"><div title="Level"><strong>{{ app.level }}</strong></div></td>
|
|
||||||
{% for status in app.statuses %}
|
|
||||||
<td class="appstatus"><div title="{{ data.testnames[loop.index-1] }}" class="{{ status }}"></div></td>
|
|
||||||
{% endfor %}
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
|
|
||||||
<script src="js/bootstrap.min.js"></script>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
Loading…
Reference in a new issue