mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00

If buildstats are available (for a certain measurement), show recipe version changes between the two builds that are being compared. The information shown includes new and dropped recipes as well as changes in recipe version, revision or epoch. [YOCTO #11382] (From OE-Core rev: 46eb839b51bb1466a9feeb09c9c437d6d45576cc) Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
287 lines
9.0 KiB
HTML
287 lines
9.0 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
{# Scripts, for visualization#}
|
|
<!--START-OF-SCRIPTS-->
|
|
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
|
|
<script type="text/javascript">
|
|
google.charts.load('current', {'packages':['corechart']});
|
|
var chartsDrawing = 0;
|
|
</script>
|
|
|
|
{# Render measurement result charts #}
|
|
{% for test in test_data %}
|
|
{% if test.status == 'SUCCESS' %}
|
|
{% for measurement in test.measurements %}
|
|
{% set chart_elem_id = test.name + '_' + measurement.name + '_chart' %}
|
|
{% include 'measurement_chart.html' %}
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
|
|
<!--END-OF-SCRIPTS-->
|
|
|
|
{# Styles #}
|
|
<style>
|
|
.meta-table {
|
|
font-size: 14px;
|
|
text-align: left;
|
|
border-collapse: collapse;
|
|
}
|
|
.meta-table tr:nth-child(even){background-color: #f2f2f2}
|
|
meta-table th, .meta-table td {
|
|
padding: 4px;
|
|
}
|
|
.summary {
|
|
margin: 0;
|
|
font-size: 14px;
|
|
text-align: left;
|
|
border-collapse: collapse;
|
|
}
|
|
summary th, .meta-table td {
|
|
padding: 4px;
|
|
}
|
|
.measurement {
|
|
padding: 8px 0px 8px 8px;
|
|
border: 2px solid #f0f0f0;
|
|
margin-bottom: 10px;
|
|
}
|
|
.details {
|
|
margin: 0;
|
|
font-size: 12px;
|
|
text-align: left;
|
|
border-collapse: collapse;
|
|
}
|
|
.details th {
|
|
padding-right: 8px;
|
|
}
|
|
.details.plain th {
|
|
font-weight: normal;
|
|
}
|
|
.preformatted {
|
|
font-family: monospace;
|
|
white-space: pre-wrap;
|
|
background-color: #f0f0f0;
|
|
margin-left: 10px;
|
|
}
|
|
hr {
|
|
color: #f0f0f0;
|
|
}
|
|
h2 {
|
|
font-size: 20px;
|
|
margin-bottom: 0px;
|
|
color: #707070;
|
|
}
|
|
h3 {
|
|
font-size: 16px;
|
|
margin: 0px;
|
|
color: #707070;
|
|
}
|
|
</style>
|
|
|
|
<title>{{ title }}</title>
|
|
</head>
|
|
|
|
{% macro poky_link(commit) -%}
|
|
<a href="http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?id={{ commit }}">{{ commit[0:11] }}</a>
|
|
{%- endmacro %}
|
|
|
|
<body><div style="width: 700px">
|
|
{# Test metadata #}
|
|
<h2>General</h2>
|
|
<hr>
|
|
<table class="meta-table" style="width: 100%">
|
|
<tr>
|
|
<th></th>
|
|
<th>Current commit</th>
|
|
<th>Comparing with</th>
|
|
</tr>
|
|
{% for key, item in metadata.items() %}
|
|
<tr>
|
|
<th>{{ item.title }}</th>
|
|
{%if key == 'commit' %}
|
|
<td>{{ poky_link(item.value) }}</td>
|
|
<td>{{ poky_link(item.value_old) }}</td>
|
|
{% else %}
|
|
<td>{{ item.value }}</td>
|
|
<td>{{ item.value_old }}</td>
|
|
{% endif %}
|
|
</tr>
|
|
{% endfor %}
|
|
</table>
|
|
|
|
{# Test result summary #}
|
|
<h2>Test result summary</h2>
|
|
<hr>
|
|
<table class="summary" style="width: 100%">
|
|
{% for test in test_data %}
|
|
{% if loop.index is even %}
|
|
{% set row_style = 'style="background-color: #f2f2f2"' %}
|
|
{% else %}
|
|
{% set row_style = 'style="background-color: #ffffff"' %}
|
|
{% endif %}
|
|
{% if test.status == 'SUCCESS' %}
|
|
{% for measurement in test.measurements %}
|
|
<tr {{ row_style }}>
|
|
{% if loop.index == 1 %}
|
|
<td>{{ test.name }}: {{ test.description }}</td>
|
|
{% else %}
|
|
{# add empty cell in place of the test name#}
|
|
<td></td>
|
|
{% endif %}
|
|
{% if measurement.absdiff > 0 %}
|
|
{% set result_style = "color: red" %}
|
|
{% elif measurement.absdiff == measurement.absdiff %}
|
|
{% set result_style = "color: green" %}
|
|
{% else %}
|
|
{% set result_style = "color: orange" %}
|
|
{%endif %}
|
|
<td>{{ measurement.description }}</td>
|
|
<td style="font-weight: bold">{{ measurement.value.mean }}</td>
|
|
<td style="{{ result_style }}">{{ measurement.absdiff_str }}</td>
|
|
<td style="{{ result_style }}">{{ measurement.reldiff }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
{% else %}
|
|
<td style="font-weight: bold; color: red;">{{test.status }}</td>
|
|
<td></td> <td></td> <td></td> <td></td>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</table>
|
|
|
|
{# Detailed test results #}
|
|
{% for test in test_data %}
|
|
<h2>{{ test.name }}: {{ test.description }}</h2>
|
|
<hr>
|
|
{% if test.status == 'SUCCESS' %}
|
|
{% for measurement in test.measurements %}
|
|
<div class="measurement">
|
|
<h3>{{ measurement.description }}</h3>
|
|
<div style="font-weight:bold;">
|
|
<span style="font-size: 23px;">{{ measurement.value.mean }}</span>
|
|
<span style="font-size: 20px; margin-left: 12px">
|
|
{% if measurement.absdiff > 0 %}
|
|
<span style="color: red">
|
|
{% elif measurement.absdiff == measurement.absdiff %}
|
|
<span style="color: green">
|
|
{% else %}
|
|
<span style="color: orange">
|
|
{% endif %}
|
|
{{ measurement.absdiff_str }} ({{measurement.reldiff}})
|
|
</span></span>
|
|
</div>
|
|
{# Table for trendchart and the statistics #}
|
|
<table style="width: 100%">
|
|
<tr>
|
|
<td style="width: 75%">
|
|
{# Linechart #}
|
|
<div id="{{ test.name }}_{{ measurement.name }}_chart"></div>
|
|
</td>
|
|
<td>
|
|
{# Measurement statistics #}
|
|
<table class="details plain">
|
|
<tr>
|
|
<th>Test runs</th><td>{{ measurement.value.sample_cnt }}</td>
|
|
</tr><tr>
|
|
<th>-/+</th><td>-{{ measurement.value.minus }} / +{{ measurement.value.plus }}</td>
|
|
</tr><tr>
|
|
<th>Min</th><td>{{ measurement.value.min }}</td>
|
|
</tr><tr>
|
|
<th>Max</th><td>{{ measurement.value.max }}</td>
|
|
</tr><tr>
|
|
<th>Stdev</th><td>{{ measurement.value.stdev }}</td>
|
|
</tr><tr>
|
|
<th><div id="{{ test.name }}_{{ measurement.name }}_chart_png"></div></th>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
{# Task and recipe summary from buildstats #}
|
|
{% if 'buildstats' in measurement %}
|
|
Task resource usage
|
|
<table class="details" style="width:100%">
|
|
<tr>
|
|
<th>Number of tasks</th>
|
|
<th>Top consumers of cputime</th>
|
|
</tr>
|
|
<tr>
|
|
<td style="vertical-align: top">{{ measurement.buildstats.tasks.count }} ({{ measurement.buildstats.tasks.change }})</td>
|
|
{# Table of most resource-hungry tasks #}
|
|
<td>
|
|
<table class="details plain">
|
|
{% for diff in measurement.buildstats.top_consumer|reverse %}
|
|
<tr>
|
|
<th>{{ diff.pkg }}.{{ diff.task }}</th>
|
|
<td>{{ '%0.0f' % diff.value2 }} s</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Biggest increase in cputime</th>
|
|
<th>Biggest decrease in cputime</th>
|
|
</tr>
|
|
<tr>
|
|
{# Table biggest increase in resource usage #}
|
|
<td>
|
|
<table class="details plain">
|
|
{% for diff in measurement.buildstats.top_increase|reverse %}
|
|
<tr>
|
|
<th>{{ diff.pkg }}.{{ diff.task }}</th>
|
|
<td>{{ '%+0.0f' % diff.absdiff }} s</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</table>
|
|
</td>
|
|
{# Table biggest decrease in resource usage #}
|
|
<td>
|
|
<table class="details plain">
|
|
{% for diff in measurement.buildstats.top_decrease %}
|
|
<tr>
|
|
<th>{{ diff.pkg }}.{{ diff.task }}</th>
|
|
<td>{{ '%+0.0f' % diff.absdiff }} s</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
{# Recipe version differences #}
|
|
{% if measurement.buildstats.ver_diff %}
|
|
<div style="margin-top: 16px">Recipe version changes</div>
|
|
<table class="details">
|
|
{% for head, recipes in measurement.buildstats.ver_diff.items() %}
|
|
<tr>
|
|
<th colspan="2">{{ head }}</th>
|
|
</tr>
|
|
{% for name, info in recipes|sort %}
|
|
<tr>
|
|
<td>{{ name }}</td>
|
|
<td>{{ info }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
{% endfor %}
|
|
</table>
|
|
{% else %}
|
|
<div style="margin-top: 16px">No recipe version changes detected</div>
|
|
{% endif %}
|
|
{% endif %}
|
|
</div>
|
|
{% endfor %}
|
|
{# Unsuccessful test #}
|
|
{% else %}
|
|
<span style="font-size: 150%; font-weight: bold; color: red;">{{ test.status }}
|
|
{% if test.err_type %}<span style="font-size: 75%; font-weight: normal">({{ test.err_type }})</span>{% endif %}
|
|
</span>
|
|
<div class="preformatted">{{ test.message }}</div>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</div></body>
|
|
</html>
|
|
|