[% WRAPPER layout.tt title="Evaluation $eval.id of jobset " _ makeNameTextForJobset(jobset) titleHTML="Evaluation $eval.id of jobset " _ linkToJobset(jobset) %] [% PROCESS common.tt %] <div class="dropdown"> <button class="btn btn-primary dropdown-toggle float-right" data-toggle="dropdown"><i class="fas fa-eye"></i> Compare to...</button> <div class="dropdown-menu dropdown-menu-right"> <a class="dropdown-item" href="?">Preceding evaluation in this jobset</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="?compare=-[% 24 * 60 * 60 %]&full=[% full ? 1 : 0 %]">This jobset <strong>one day</strong> earlier</a> <a class="dropdown-item" href="?compare=-[% 7 * 24 * 60 * 60 %]&full=[% full ? 1 : 0 %]">This jobset <strong>one week</strong> earlier</a> <a class="dropdown-item" href="?compare=-[% 31 * 24 * 60 * 60 %]&full=[% full ? 1 : 0 %]">This jobset <strong>one month</strong> earlier</a> [% IF project.jobsets_rs.count > 1 %] <div class="dropdown-divider"></div> [% FOREACH j IN project.jobsets.sort('name'); IF j.name != jobset.name %] <a class="dropdown-item" href="?compare=[% j.name %]&full=[% full ? 1 : 0 %]">Jobset <tt>[% project.name %]:[% j.name %]</tt></a> [% END; END %] [% END %] </div> </div> <p>This evaluation was performed [% IF eval.flake %]from the flake <tt>[%HTML.escape(eval.flake)%]</tt>[%END%] on [% INCLUDE renderDateTime timestamp=eval.timestamp %]. Fetching the dependencies took [% eval.checkouttime %]s and evaluation took [% eval.evaltime %]s.</p> [% IF otherEval %] <p>Comparisons are relative to [% INCLUDE renderFullJobsetName project=otherEval.jobset.project.name jobset=otherEval.jobset.name %] evaluation <a href="[% c.uri_for(c.controller('JobsetEval').action_for('view'), [otherEval.id]) %]">[% otherEval.id %]</a>.</p> [% ELSE %] <div class="alert alert-danger">Couldn't find an evaluation to compare to.</div> [% END %] <form> <div class="form-group"> <input name="filter" type="text" class="form-control" type="search" placeholder="Search jobs by name..." [% HTML.attributes(value => filter) %]/> <input name="compare" type="hidden" [% HTML.attributes(value => otherEval.id) %]/> <input name="full" type="hidden" [% HTML.attributes(value => full) %]/> </div> </form> <ul class="nav nav-tabs"> [% IF c.user_exists %] <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">Actions</a> <div class="dropdown-menu"> <a class="dropdown-item" href="[% c.uri_for(c.controller('JobsetEval').action_for('create_jobset'), [eval.id]) %]">Create a jobset from this evaluation</a> [% IF unfinished.size > 0 %] <a class="dropdown-item" href="[% c.uri_for(c.controller('JobsetEval').action_for('cancel'), [eval.id]) %]">Cancel all scheduled builds</a> [% END %] [% IF aborted.size > 0 || stillFail.size > 0 || nowFail.size > 0 || failed.size > 0 %] <a class="dropdown-item" href="[% c.uri_for(c.controller('JobsetEval').action_for('restart_failed'), [eval.id]) %]">Restart all failed builds</a> [% END %] [% IF aborted.size > 0 %] <a class="dropdown-item" href="[% c.uri_for(c.controller('JobsetEval').action_for('restart_aborted'), [eval.id]) %]">Restart all aborted builds</a> [% END %] [% IF unfinished.size > 0 %] <a class="dropdown-item" href="[% c.uri_for(c.controller('JobsetEval').action_for('bump'), [eval.id]) %]">Bump builds to front of queue</a> [% END %] </div> </li> [% END %] [% IF aborted.size > 0 %] <li class="nav-item"><a class="nav-link" href="#tabs-aborted" data-toggle="tab"><span class="text-warning">Aborted Jobs ([% aborted.size %])</span></a></li> [% END %] [% IF nowFail.size > 0 %] <li class="nav-item"><a class="nav-link" href="#tabs-now-fail" data-toggle="tab"><span class="text-warning">Newly Failing Jobs ([% nowFail.size %])</span></a></li> [% END %] [% IF nowSucceed.size > 0 %] <li class="nav-item"><a class="nav-link" href="#tabs-now-succeed" data-toggle="tab"><span class="text-success">Newly Succeeding Jobs ([% nowSucceed.size %])</span></a></li> [% END %] [% IF new.size > 0 %] <li class="nav-item"><a class="nav-link" href="#tabs-new" data-toggle="tab">New Jobs ([% new.size %])</a></li> [% END %] [% IF removed.size > 0 %] <li class="nav-item"><a class="nav-link" href="#tabs-removed" data-toggle="tab">Removed Jobs ([% removed.size %])</a></li> [% END %] [% IF stillFail.size > 0 %] <li class="nav-item"><a class="nav-link" href="#tabs-still-fail" data-toggle="tab">Still Failing Jobs ([% stillFail.size %])</a></li> [% END %] [% IF stillSucceed.size > 0 %] <li class="nav-item"><a class="nav-link" href="#tabs-still-succeed" data-toggle="tab">Still Succeeding Jobs ([% stillSucceed.size %])</a></li> [% END %] [% IF unfinished.size > 0 %] <li class="nav-item"><a class="nav-link" href="#tabs-unfinished" data-toggle="tab">Queued Jobs ([% unfinished.size %])</a></li> [% END %] <li class="nav-item"><a class="nav-link" href="#tabs-inputs" data-toggle="tab">Inputs</a></li> [% IF eval.evaluationerror.errormsg %] <li class="nav-item"><a class="nav-link" href="#tabs-errors" data-toggle="tab"><span class="text-warning">Evaluation Errors</span></a></li> [% END %] </ul> [% BLOCK renderSome %] [% INCLUDE renderBuildListHeader unsortable=1 %] [% size = builds.size; max = full ? size : 250; %] [% INCLUDE renderBuildListBody builds=builds.slice(0, (size > max ? max : size) - 1) hideProjectName=1 hideJobsetName=1 busy=0 %] [% IF size > max; params = c.req.params; params.full = 1 %] <tr><td class="centered" colspan="6"><a href="[% c.uri_for(c.controller('JobsetEval').action_for('view'), [eval.id], params) %][% tabname %]"><em>([% size - max %] more builds omitted)</em></a></td></tr> [% END %] [% INCLUDE renderBuildListFooter %] [% END %] <div class="tab-content"> [% IF eval.evaluationerror.errormsg %] <div id="tabs-errors" class="tab-pane"> <p>Errors occurred at [% INCLUDE renderDateTime timestamp=(eval.evaluationerror.errortime || eval.timestamp) %].</p> <div class="card bg-light"><div class="card-body"><pre>[% HTML.escape(eval.evaluationerror.errormsg) %]</pre></div></div> </div> [% END %] <div id="tabs-aborted" class="tab-pane"> [% INCLUDE renderSome builds=aborted tabname="#tabs-aborted" %] </div> <div id="tabs-now-fail" class="tab-pane"> [% INCLUDE renderSome builds=nowFail tabname="#tabs-now-fail" %] </div> <div id="tabs-now-succeed" class="tab-pane"> [% INCLUDE renderSome builds=nowSucceed tabname="#tabs-now-succeed" %] </div> <div id="tabs-new" class="tab-pane"> [% INCLUDE renderSome builds=new tabname="#tabs-new" %] </div> <div id="tabs-removed" class="tab-pane"> <table class="table table-striped table-condensed clickable-rows"> <thead> <tr><th>Job</th><th>System</th></tr> </thead> <tbody> [% size = removed.size; max = full ? size : 250; %] [% FOREACH j IN removed.slice(0,(size > max ? max : size) - 1) %] <tr> <td>[% INCLUDE renderJobName project=project.name jobset=jobset.name job=j.job %]</td> <td><tt>[% j.system %]</tt></td> </tr> [% END %] [% IF size > max; params = c.req.params; params.full = 1 %] <tr><td class="centered" colspan="2"><a href="[% c.uri_for(c.controller('JobsetEval').action_for('view'), [eval.id], params) %]#tabs-removed"><em>([% size - max %] more jobs omitted)</em></a></td></tr> [% END %] </tbody> </table> </div> <div id="tabs-still-fail" class="tab-pane"> [% INCLUDE renderSome builds=stillFail tabname="#tabs-still-fail" %] </div> <div id="tabs-still-succeed" class="tab-pane"> [% INCLUDE renderSome builds=stillSucceed tabname="#tabs-still-succeed" %] </div> <div id="tabs-unfinished" class="tab-pane"> [% INCLUDE renderSome builds=unfinished tabname="#tabs-unfinished" %] </div> <div id="tabs-inputs" class="tab-pane"> [% INCLUDE renderInputs inputs=eval.jobsetevalinputs %] [% IF otherEval %] <h3>Changes</h3> [% INCLUDE renderInputDiff inputs2=eval.jobsetevalinputs inputs1=otherEval.jobsetevalinputs %] [% END %] </div> [% IF eval.evaluationerror.errormsg %] <div id="tabs-errors" class="tab-pane"> <p>Errors occurred at [% INCLUDE renderDateTime timestamp=(eval.evaluationerror.errortime || eval.timestamp) %].</p> <div class="card bg-light"><div class="card-body"><pre>[% HTML.escape(eval.evaluationerror.errormsg) %]</pre></div></div> </div> [% END %] </div> [% END %]