blob: a0da71ea4c0f0d5195c29c6efbcac3c36dd4d466 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001{% extends "basebuildpage.html" %}
2{% load humanize %}
3{% load projecttags %}
4
Patrick Williamsf1e5d692016-03-30 15:21:19 -05005{% block title %} {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - {{build.project.name}} - Toaster {% endblock %}
Patrick Williamsc124f4f2015-09-15 14:41:29 -05006{% block parentbreadcrumb %}
Patrick Williamsf1e5d692016-03-30 15:21:19 -05007{% if build.get_sorted_target_list.count > 0 %}
8 {{build.get_sorted_target_list.0.target}}
Patrick Williamsf1e5d692016-03-30 15:21:19 -05009{% endif %}
10
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050011{%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"}})
Patrick Williamsc124f4f2015-09-15 14:41:29 -050012{% endblock %}
13
14{% block buildinfomain %}
15<!-- page title -->
16<div class="row-fluid span10">
17 <div class="page-header">
18 <h1>{{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}}</h1>
19 </div>
20</div>
21
22<!-- build result bar -->
23<div class="row-fluid span10 pull-right">
24 <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}">
25 <div class="row-fluid lead">
26 <span class="pull-left"><strong>
27 {%if build.outcome == build.SUCCEEDED%}Completed{%elif build.outcome == build.FAILED%}Failed{%else%}{%endif%}
28 </strong> on
29 {{build.completed_on|date:"d/m/y H:i"}}
30</span>
31{% if build.warnings.count or build.errors.count %}
32&nbsp;with
33{% endif %}
34{%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
35{% if build.errors.count %}
36 <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>
37{% endif %}
38{% if build.warnings.count %}
39{% if build.errors.count %}
40 and
41{% endif %}
42 <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>
43{% endif %}
44 <span class="pull-right">Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent_seconds|sectohms }}</a>
Patrick Williamsf1e5d692016-03-30 15:21:19 -050045 {% if build.cooker_log_path %}
46 <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>
47 {% endif %}
Patrick Williamsc124f4f2015-09-15 14:41:29 -050048 </span>
49
50{%endif%}
51 </div>
Patrick Williamsc124f4f2015-09-15 14:41:29 -050052 </div>
53</div>
54
55{% if build.errors.count %}
56<div class="accordion span10 pull-right" id="errors">
57 <div class="accordion-group">
58 <div class="accordion-heading">
59 <a class="accordion-toggle error toggle-errors">
60 <h2 id="error-toggle">
61 <i class="icon-minus-sign"></i>
62 {{build.errors.count}} error{{build.errors.count|pluralize}}
63 </h2>
64 </a>
65 </div>
66 <div class="accordion-body collapse in" id="collapse-errors">
67 <div class="accordion-inner">
68 <div class="span10">
Patrick Williamsf1e5d692016-03-30 15:21:19 -050069 {% for error in build.errors %}
70 <div class="alert alert-error" data-error="{{ error.id }}">
Patrick Williamsc124f4f2015-09-15 14:41:29 -050071 <pre>{{error.message}}</pre>
72 </div>
Patrick Williamsc124f4f2015-09-15 14:41:29 -050073 {% endfor %}
74 </div>
75 </div>
76 </div>
77 </div>
78</div>
79{% endif %}
80
81{%if build.outcome == build.SUCCEEDED%}
82<!-- built images -->
83{% if hasImages %}
84<div class="row-fluid span10 pull-right">
85 <h2>Images</h2>
86 {% for target in targets %}
87 {% if target.target.is_image %}
88 <div class="well dashboard-section">
89 <h3><a href="{% url 'target' build.pk target.target.pk %}">{{target.target}}</a>
90 </h3>
91 <dl class="dl-horizontal">
92 <dt>Packages included</dt>
93 <dd><a href="{% url 'target' build.pk target.target.pk %}">{{target.npkg}}</a></dd>
94 <dt>Total package size</dt>
95 <dd>{{target.pkgsz|filtered_filesizeformat}}</dd>
96 {% if target.targetHasNoImages %}
97 </dl>
98 <div class="row-fluid">
99 <div class="alert alert-info span7">
100 <p>
101 <b>This build did not create any image files</b>
102 </p>
103 <p>
104 This is probably because valid image and license manifest
105 files from a previous build already exist in your
106 <code>.../poky/build/tmp/deploy</code>
107 directory. You can
108 also <a href="{% url 'targetpkg' build.pk target.target.pk %}">view the
109 license manifest information</a> in Toaster.
110 </p>
111 </div>
112 </div>
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500113 {% else %}
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500114 <dt>
115 <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>
116
117 License manifest
118 </dt>
119 <dd>
120 <a href="{% url 'targetpkg' build.pk target.target.pk %}">View in Toaster</a> |
121 <a href="{% url 'build_artifact' build.pk 'licensemanifest' target.target.pk %}">Download</a></dd>
122 <dt>
123 <i class="icon-question-sign get-help" title="Image files are stored in <code>/build/tmp/deploy/images/</code>"></i>
124 Image files
125 </dt>
126 <dd>
127 <ul>
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500128 {% for i in target.imageFiles %}
129 <li>
130 <a href="{% url 'build_artifact' build.pk 'imagefile' i.id %}">
131 {{i.suffix}}
132 </a>
133 &nbsp;({{i.size|filtered_filesizeformat}})
134 </li>
135 {% endfor %}
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500136 </ul>
137 </dd>
138 </dl>
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500139 {% endif %}
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500140 </div>
141 {% endif %}
142 {% endfor %}
143</div>
144{% endif %}
145
146{%else%}
147<!-- error dump -->
148{%endif%}
149
150<!-- other artifacts -->
151{% if build.buildartifact_set.all.count > 0 %}
152<div class="row-fluid span10 pull-right">
153<h2>Other artifacts</h2>
154
155 <div class="well dashboard-section">
156 <dl class="dl-horizontal">
157 <dt>
158 <i class="icon-question-sign get-help" title="Build artifacts discovered in <i>tmp/deploy/images</i>. Usually kernel images and kernel modules."></i>
159 Other artifacts</dt>
160 <dd><div>
161 {% for ba in build.buildartifact_set.all|dictsort:"file_name" %}
162 <a href="{%url 'build_artifact' build.id 'buildartifact' ba.id %}">
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500163 {{ba.get_basename}}
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500164 </a>
165
166 ({{ba.file_size|filtered_filesizeformat}}) <br/>
167 {% endfor %}
168 </div>
169 </dd>
170 </dl>
171 </div>
172
173</div>
174{% endif %}
175<!-- build summary -->
176<div class="row-fluid span10 pull-right">
177<h2>Build summary</h2>
178 <div class="well span4 dashboard-section" style="margin-left:0px;">
179 <h4><a href="{%url 'configuration' build.pk%}">Configuration</a></h4>
180 <dl>
181 <dt>Machine</dt><dd>{{build.machine}}</dd>
182 <dt>Distro</dt><dd>{{build.distro}}</dd>
183 <dt>Layers</dt>{% for i in build.layer_version_build.all|dictsort:"layer.name" %}<dd>{{i.layer.name}}</dd>{%endfor%}
184 </dl>
185 </div>
186 <div class="well span4 dashboard-section">
187 <h4><a href="{%url 'tasks' build.pk%}">Tasks</a></h4>
188 <dl>
189 {% query build.task_build outcome=4 order__gt=0 as exectask%}
190 {% if exectask.count > 0 %}
191 <dt>Failed tasks</dt>
192 <dd>
193 {% if exectask.count == 1 %}
194 <a class="error" href="{% url "task" build.id exectask.0.id %}">
195 {{exectask.0.recipe.name}}
196 <span class="task-name">{{exectask.0.task_name}}</span>
197 </a>
198
199 <a href="{% url 'build_artifact' build.id "tasklogfile" exectask.0.id %}">
200 <i class="icon-download-alt" title="" data-original-title="Download task log file"></i>
201 </a>
202
203 {% elif exectask.count > 1%}
204 <a class="error" href="{% url "tasks" build.id %}?filter=outcome%3A4">{{exectask.count}}</a>
205 {% endif %}
206 </dd>
207 {% endif %}
208 <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>
209 <dt>
210 Tasks executed
211 <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>
212 </dt>
213 <dd><a href="{% url 'tasks' build.pk %}?filter=task_executed%3A1&amp;count=25&amp;search=&amp;page=1&amp;orderby=order%3A%2B">{% query build.task_build task_executed=1 order__gt=0 as exectask%}{{exectask.count}}</a></dd>
214 <dt>
215 Tasks not executed
216 <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>
217 </dt>
218 <dd><a href="{% url 'tasks' build.pk %}?filter=task_executed%3A0&amp;count=25&amp;search=&amp;page=1&amp;orderby=order%3A%2B">{% query build.task_build task_executed=0 order__gt=0 as noexectask%}{{noexectask.count}}</a></dd>
219 <dt>
220 Reuse
221 <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>
222 </dt>
223 <dd>
224{% query build.task_build order__gt=0 as texec %}
225{% if noexectask.count|multiply:100|divide:texec.count < 0 %}
2260
227{% else %}
228{{noexectask.count|multiply:100|divide:texec.count}}
229{% endif %}
230%
231 </dd>
232 </dl>
233 </div>
234 <div class="well span4 dashboard-section">
235 <h4><a href="{% url 'recipes' build.pk %}">Recipes</a> & <a href="{% url 'packages' build.pk %}">Packages</a></h4>
236 <dl>
237 <dt>Recipes built</dt><dd><a href="{% url 'recipes' build.pk %}">{{recipecount}}</a></dd>
238 <dt>Packages built</dt><dd><a href="{% url 'packages' build.pk %}">{{packagecount}}</a></dd>
239 </dl>
240 </div>
241</div>
242
243{% if build.warnings.count %}
244<div class="accordion span10 pull-right" id="warnings">
245 <div class="accordion-group">
246 <div class="accordion-heading">
247 <a class="accordion-toggle warning toggle-warnings">
248 <h2 id="warning-toggle">
249 <i class="icon-warning-sign"></i>
250 {{build.warnings.count}} warning{{build.warnings.count|pluralize}}
251 </h2>
252 </a>
253 </div>
254 <div class="accordion-body collapse" id="collapse-warnings">
255 <div class="accordion-inner">
256 <div class="span10">
257 {% for warning in logmessages %}{% if warning.level == 1 %}
258 <div class="alert alert-warning">
259 <pre>{{warning.message}}</pre>
260 </div>
261 {% endif %}{% endfor %}
262 </div>
263 </div>
264 </div>
265 </div>
266</div>
267{% endif %}
268
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500269<script type="text/javascript">
270 $(document).ready(function() {
271 //show warnings section when requested from the previous page
272 if (location.href.search('#warnings') > -1) {
273 $('#collapse-warnings').addClass('in');
274 }
275 });
276</script>
277
278{% endblock %}