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