2013-12-11 16:42:34 +00:00
{% extends "basebuildpage.html" %}
2013-12-13 17:14:34 +00:00
{% load humanize %}
{% load projecttags %}
2013-12-11 16:42:34 +00:00
2014-03-25 02:50:50 +00:00
{% block parentbreadcrumb %}
{{build.get_sorted_target_list.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}})
{% endblock %}
2013-12-11 16:42:34 +00:00
{% block buildinfomain %}
2013-12-13 17:14:34 +00:00
<!-- page title -->
< div class = "row-fluid span10" >
< div class = "page-header" >
2014-03-31 14:46:53 +00:00
< h1 > {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}}< / h1 >
2013-12-13 17:14:34 +00:00
< / div >
< / div >
<!-- build result bar -->
< div class = "row-fluid span10 pull-right" >
< div class = "alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}" >
< div class = "row-fluid lead" >
2014-03-21 12:35:50 +00:00
< span class = "pull-left" > < strong >
{%if build.outcome == build.SUCCEEDED%}Completed{%elif build.outcome == build.FAILED%}Failed{%else%}{%endif%}
2014-03-31 14:46:53 +00:00
< / strong > on
2014-03-21 12:35:50 +00:00
{{build.completed_on|date:"d/m/y H:i"}}
< / span >
2015-06-17 16:30:34 +00:00
{% if build.warnings.count or build.errors.count %}
2014-03-21 12:35:50 +00:00
with
{% endif %}
{%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
2015-06-17 16:30:34 +00:00
{% if build.errors.count %}
< span > < i class = "icon-minus-sign red" > < / i > < strong > < a href = "#errors" class = "error show-errors" > {{build.errors.count}} error{{build.errors.count|pluralize}}< / a > < / strong > < / span >
2013-12-13 17:14:34 +00:00
{% endif %}
2015-06-17 16:30:34 +00:00
{% if build.warnings.count %}
{% if build.errors.count %}
2014-03-31 14:46:53 +00:00
and
2014-03-21 12:35:50 +00:00
{% endif %}
2015-06-17 16:30:34 +00:00
< span > < i class = "icon-warning-sign yellow" > < / i > < strong > < a href = "#warnings" class = "warning show-warnings" > {{build.warnings.count}} warning{{build.warnings.count|pluralize}}< / a > < / strong > < / span >
2013-12-13 17:14:34 +00:00
{% endif %}
2015-06-17 16:30:34 +00:00
< span class = "pull-right" > Build time: < a href = "{% url 'buildtime' build.pk %}" > {{ build.timespent_seconds|sectohms }}< / a >
2015-10-07 10:20:15 +00:00
{% if build.cooker_log_path %}
< a class = "btn {%if build.outcome == build.SUCCEEDED%}btn-success{%else%}btn-danger{%endif%} pull-right log" href = "{% url 'build_artifact' build.id " cookerlog " build . id % } " > Download build log< / a >
{% endif %}
2015-02-16 17:47:07 +00:00
< / span >
2015-06-17 16:30:34 +00:00
2013-12-13 17:14:34 +00:00
{%endif%}
< / div >
2014-11-25 10:12:46 +00:00
{% if build.toaster_exceptions.count > 0 %}
< div class = "row" >
< small class = "pull-right" >
2014-12-05 15:19:55 +00:00
< i class = "icon-question-sign get-help get-help-blue" title = "" data-original-title = "Toaster exceptions do not affect your build: only the operation of Toaster" > < / i >
< a class = "show-exceptions" href = "#exceptions" > Toaster threw {{build.toaster_exceptions.count}} exception{{build.toaster_exceptions.count|pluralize}}< / a >
< / small >
2014-11-25 10:12:46 +00:00
< / div >
{% endif %}
2013-12-13 17:14:34 +00:00
< / div >
< / div >
2015-06-17 16:30:34 +00:00
{% if build.errors.count %}
2014-03-12 18:47:42 +00:00
< div class = "accordion span10 pull-right" id = "errors" >
< div class = "accordion-group" >
< div class = "accordion-heading" >
2015-02-16 17:47:07 +00:00
< a class = "accordion-toggle error toggle-errors" >
2014-03-12 18:47:42 +00:00
< h2 id = "error-toggle" >
< i class = "icon-minus-sign" > < / i >
2015-06-17 16:30:34 +00:00
{{build.errors.count}} error{{build.errors.count|pluralize}}
2014-03-12 18:47:42 +00:00
< / h2 >
< / a >
< / div >
< div class = "accordion-body collapse in" id = "collapse-errors" >
< div class = "accordion-inner" >
< div class = "span10" >
2015-10-15 12:45:13 +00:00
{% for error in logmessages %}
{% if error.level == 2 or error.level == 3 %}
< div class = "alert alert-error" >
< pre > {{error.message}}< / pre >
< / div >
{% endif %}
2014-12-05 15:19:55 +00:00
{% endfor %}
2014-03-12 18:47:42 +00:00
< / div >
< / div >
< / div >
< / div >
< / div >
{% endif %}
2013-12-13 17:14:34 +00:00
{%if build.outcome == build.SUCCEEDED%}
<!-- built images -->
2014-09-29 13:23:22 +00:00
{% if hasImages %}
2013-12-13 17:14:34 +00:00
< div class = "row-fluid span10 pull-right" >
2014-12-05 15:19:55 +00:00
< h2 > Images< / h2 >
{% for target in targets %}
2014-03-21 12:35:50 +00:00
{% if target.target.is_image %}
2014-12-05 15:19:55 +00:00
< div class = "well dashboard-section" >
< h3 > < a href = "{% url 'target' build.pk target.target.pk %}" > {{target.target}}< / a >
2014-03-21 12:35:50 +00:00
< / h3 >
2014-12-05 15:19:55 +00:00
< dl class = "dl-horizontal" >
< dt > Packages included< / dt >
< dd > < a href = "{% url 'target' build.pk target.target.pk %}" > {{target.npkg}}< / a > < / dd >
< dt > Total package size< / dt >
< dd > {{target.pkgsz|filtered_filesizeformat}}< / dd >
2014-05-23 19:09:29 +00:00
{% if target.targetHasNoImages %}
2014-12-05 15:19:55 +00:00
< / dl >
< div class = "row-fluid" >
< div class = "alert alert-info span7" >
2014-06-11 09:58:55 +00:00
< p >
< b > This build did not create any image files< / b >
< / p >
< p >
This is probably because valid image and license manifest
files from a previous build already exist in your
< code > .../poky/build/tmp/deploy< / code >
directory. You can
also < a href = "{% url 'targetpkg' build.pk target.target.pk %}" > view the
license manifest information< / a > in Toaster.
< / p >
< / div >
2014-12-05 15:19:55 +00:00
< / div >
2014-05-23 19:09:29 +00:00
{% else %}
2014-12-05 15:19:55 +00:00
< dt >
< i class = "icon-question-sign get-help" title = "The location in disk of the license manifest, a document listing all packages installed in your image and their licenses" > < / i >
License manifest
< / dt >
< dd >
< a href = "{% url 'targetpkg' build.pk target.target.pk %}" > View in Toaster< / a > |
< a href = "{% url 'build_artifact' build.pk 'licensemanifest' target.target.pk %}" > Download< / a > < / dd >
< dt >
< i class = "icon-question-sign get-help" title = "Image files are stored in <code>/build/tmp/deploy/images/</code>" > < / i >
Image files
< / dt >
< dd >
< ul >
2014-03-21 12:35:50 +00:00
{% for i in target.imageFiles %}
2014-12-05 15:19:55 +00:00
{% if build.project %}
< li > < a href = "{% url 'build_artifact' build.pk 'imagefile' i.id %}" > {{i.path}}< / a >
{% else %}
< li > {{i.path}}
{% endif %}
({{i.size|filtered_filesizeformat}})< / li >
2014-03-21 12:35:50 +00:00
{% endfor %}
2014-12-05 15:19:55 +00:00
< / ul >
< / dd >
< / dl >
2014-06-11 09:58:55 +00:00
{% endif %}
2014-12-05 15:19:55 +00:00
< / div >
2014-03-21 12:35:50 +00:00
{% endif %}
2014-12-05 15:19:55 +00:00
{% endfor %}
2013-12-13 17:14:34 +00:00
< / div >
2014-09-29 13:23:22 +00:00
{% endif %}
2013-12-13 17:14:34 +00:00
{%else%}
<!-- error dump -->
{%endif%}
2014-12-05 15:19:55 +00:00
<!-- other artifacts -->
{% if build.buildartifact_set.all.count > 0 %}
< div class = "row-fluid span10 pull-right" >
< h2 > Other artifacts< / h2 >
< div class = "well dashboard-section" >
< dl class = "dl-horizontal" >
< dt >
< i class = "icon-question-sign get-help" title = "Build artifacts discovered in <i>tmp/deploy/images</i>. Usually kernel images and kernel modules." > < / i >
Other artifacts< / dt >
< dd > < div >
{% for ba in build.buildartifact_set.all|dictsort:"file_name" %}
< a href = "{%url 'build_artifact' build.id 'buildartifact' ba.id %}" >
{{ba.get_local_file_name}}
< / a >
({{ba.file_size|filtered_filesizeformat}}) < br / >
{% endfor %}
< / div >
< / dd >
2015-05-11 17:58:25 +00:00
< / dl >
2014-12-05 15:19:55 +00:00
< / div >
< / div >
{% endif %}
2013-12-13 17:14:34 +00:00
<!-- build summary -->
< div class = "row-fluid span10 pull-right" >
< h2 > Build summary< / h2 >
2014-03-31 14:46:53 +00:00
< div class = "well span4 dashboard-section" style = "margin-left:0px;" >
2013-12-13 17:14:34 +00:00
< h4 > < a href = "{%url 'configuration' build.pk%}" > Configuration< / a > < / h4 >
< dl >
< dt > Machine< / dt > < dd > {{build.machine}}< / dd >
2014-03-21 12:35:50 +00:00
< dt > Distro< / dt > < dd > {{build.distro}}< / dd >
< dt > Layers< / dt > {% for i in build.layer_version_build.all|dictsort:"layer.name" %}< dd > {{i.layer.name}}< / dd > {%endfor%}
2013-12-13 17:14:34 +00:00
< / dl >
< / div >
2014-03-31 14:46:53 +00:00
< div class = "well span4 dashboard-section" >
2013-12-13 17:14:34 +00:00
< h4 > < a href = "{%url 'tasks' build.pk%}" > Tasks< / a > < / h4 >
< dl >
2014-09-29 14:37:29 +00:00
{% query build.task_build outcome=4 order__gt=0 as exectask%}
{% if exectask.count > 0 %}
2014-12-05 15:19:55 +00:00
< dt > Failed tasks< / dt >
2014-09-29 14:37:29 +00:00
< dd >
{% if exectask.count == 1 %}
< a class = "error" href = "{% url " task " build . id exectask . 0 . id % } " >
{{exectask.0.recipe.name}}
< span class = "task-name" > {{exectask.0.task_name}}< / span >
2015-05-28 11:30:50 +00:00
< / a >
2014-12-05 15:19:55 +00:00
< a href = "{% url 'build_artifact' build.id " tasklogfile " exectask . 0 . id % } " >
< i class = "icon-download-alt" title = "" data-original-title = "Download task log file" > < / i >
< / a >
2014-09-29 14:37:29 +00:00
{% elif exectask.count > 1%}
< a class = "error" href = "{% url " tasks " build . id % } ? filter = outcome%3A4" > {{exectask.count}}< / a >
{% endif %}
< / dd >
{% endif %}
2014-04-11 16:32:30 +00:00
< dt > Total number of tasks< / dt > < dd > < a href = "{% url 'tasks' build.pk %}" > {% query build.task_build order__gt=0 as alltasks %}{{alltasks.count}}< / a > < / dd >
2014-03-16 13:09:34 +00:00
< dt >
Tasks executed
< i class = "icon-question-sign get-help" title = "'Executed' tasks are those that need to be run in order to generate the task output" > < / i >
< / dt >
< dd > < a href = "{% url 'tasks' build.pk %}?filter=task_executed%3A1&count=25&search=&page=1&orderby=order%3A%2B" > {% query build.task_build task_executed=1 order__gt=0 as exectask%}{{exectask.count}}< / a > < / dd >
< dt >
Tasks not executed
< i class = "icon-question-sign get-help" title = "'Not executed' tasks don't need to run because their outcome is provided by another task" > < / i >
2014-09-29 14:37:29 +00:00
< / dt >
2014-03-16 13:09:34 +00:00
< dd > < a href = "{% url 'tasks' build.pk %}?filter=task_executed%3A0&count=25&search=&page=1&orderby=order%3A%2B" > {% query build.task_build task_executed=0 order__gt=0 as noexectask%}{{noexectask.count}}< / a > < / dd >
< dt >
Reuse
< i class = "icon-question-sign get-help" title = "The percentage of 'not executed' tasks over the total number of tasks, which is a measure of the efficiency of your build" > < / i >
2014-09-29 14:37:29 +00:00
< / dt >
2014-03-16 13:09:34 +00:00
< dd >
2014-03-21 12:35:50 +00:00
{% query build.task_build order__gt=0 as texec %}
{% if noexectask.count|multiply:100|divide:texec.count < 0 % }
0
{% else %}
{{noexectask.count|multiply:100|divide:texec.count}}
{% endif %}
%
< / dd >
2013-12-13 17:14:34 +00:00
< / dl >
< / div >
2014-03-31 14:46:53 +00:00
< div class = "well span4 dashboard-section" >
2013-12-13 17:14:34 +00:00
< h4 > < a href = "{% url 'recipes' build.pk %}" > Recipes< / a > & < a href = "{% url 'packages' build.pk %}" > Packages< / a > < / h4 >
< dl >
2014-03-21 12:35:50 +00:00
< dt > Recipes built< / dt > < dd > < a href = "{% url 'recipes' build.pk %}" > {{recipecount}}< / a > < / dd >
2014-04-02 22:04:08 +00:00
< dt > Packages built< / dt > < dd > < a href = "{% url 'packages' build.pk %}" > {{packagecount}}< / a > < / dd >
2013-12-13 17:14:34 +00:00
< / dl >
< / div >
< / div >
2013-12-11 16:42:34 +00:00
2015-06-17 16:30:34 +00:00
{% if build.warnings.count %}
2014-03-12 18:47:42 +00:00
< div class = "accordion span10 pull-right" id = "warnings" >
< div class = "accordion-group" >
< div class = "accordion-heading" >
< a class = "accordion-toggle warning toggle-warnings" >
< h2 id = "warning-toggle" >
< i class = "icon-warning-sign" > < / i >
2015-06-17 16:30:34 +00:00
{{build.warnings.count}} warning{{build.warnings.count|pluralize}}
2014-03-12 18:47:42 +00:00
< / h2 >
< / a >
< / div >
< div class = "accordion-body collapse" id = "collapse-warnings" >
< div class = "accordion-inner" >
< div class = "span10" >
{% for warning in logmessages %}{% if warning.level == 1 %}
< div class = "alert alert-warning" >
< pre > {{warning.message}}< / pre >
< / div >
{% endif %}{% endfor %}
< / div >
< / div >
< / div >
< / div >
< / div >
{% endif %}
2014-11-25 10:12:46 +00:00
{% if build.toaster_exceptions.count > 0 %}
< div class = "accordion span10 pull-right" id = "exceptions" >
< div class = "accordion-group" >
< div class = "accordion-heading" >
< a class = "accordion-toggle exception toggle-exceptions" >
< h2 id = "exception-toggle" >
< i class = "icon-warning-sign" > < / i >
{{build.toaster_exceptions.count}} Toaster exception{{build.toaster_exceptions.count|pluralize}}
< / h2 >
< / a >
< / div >
< div class = "accordion-body collapse" id = "collapse-exceptions" >
< div class = "accordion-inner" >
< div class = "span10" >
{% for exception in build.toaster_exceptions %}
< div class = "alert alert-exception" >
< pre > {{exception.message}}< / pre >
< / div >
{% endfor %}
< / div >
< / div >
< / div >
< / div >
< / div >
{% endif %}
2014-03-31 23:39:13 +00:00
< script type = "text/javascript" >
$(document).ready(function() {
//show warnings section when requested from the previous page
if (location.href.search('#warnings') > -1) {
$('#collapse-warnings').addClass('in');
}
});
< / script >
2013-12-11 16:42:34 +00:00
{% endblock %}