forked from lix-project/hydra
4ed877360b
Each jobset now has a "scheduling share" that determines how much of the build farm's time it is entitled to. For instance, if a jobset has 100 shares and the total number of shares of all jobsets is 1000, it's entitled to 10% of the build farm's time. When there is a free build slot for a given system type, the queue runner will select the jobset that is furthest below its scheduling share over a certain time window (currently, the last day). Withing that jobset, it will pick the build with the highest priority. So meta.schedulingPriority now only determines the order of builds within a jobset, not between jobsets. This makes it much easier to prioritise one jobset over another (e.g. nixpkgs:trunk over nixpkgs:stdenv).
183 lines
6.8 KiB
Plaintext
183 lines
6.8 KiB
Plaintext
[% WRAPPER layout.tt title=(create ? "Create jobset in project $project.name" : "Editing jobset $project.name:$jobset.name") %]
|
|
[% PROCESS common.tt %]
|
|
[% USE format %]
|
|
|
|
[% BLOCK renderJobsetInputAlt %]
|
|
<button type="button" class="btn btn-warning" onclick='$(this).parents(".inputalt").remove()'><i class="icon-trash icon-white"></i></button>
|
|
<input type="text" [% HTML.attributes(value => alt.value, name => name) %]/>
|
|
<br />
|
|
[% END %]
|
|
|
|
[% BLOCK renderJobsetInput %]
|
|
<tr class="input [% extraClass %]" [% IF id %]id="[% id %]"[% END %]>
|
|
<td>
|
|
<button type="button" class="btn btn-warning" onclick='$(this).parents(".input").remove()'><i class="icon-trash icon-white"></i></button>
|
|
<input type="text" id="[% baseName %]-name" name="[% baseName %]-name" [% HTML.attributes(value => input.name) %]/>
|
|
</td>
|
|
<td>
|
|
[% INCLUDE renderSelection curValue=input.type param="$baseName-type" options=inputTypes %]
|
|
</td>
|
|
<td class="inputalts" id="[% baseName %]">
|
|
[% FOREACH alt IN input.jobsetinputalts %]
|
|
<span class="inputalt">
|
|
[% INCLUDE renderJobsetInputAlt alt=alt name="$baseName-values" %]
|
|
</span>
|
|
[% END %]
|
|
[% IF edit %]<button type="button" class="add-inputalt btn btn-success" onclick='return false'><i class="icon-plus icon-white"></i></button>[% END %]
|
|
</td>
|
|
</tr>
|
|
[% END %]
|
|
|
|
[% BLOCK renderJobsetInputs %]
|
|
<table class="table table-striped table-condensed">
|
|
<thead>
|
|
<tr><th>Input name</th><th>Type</th><th>Values</th></tr>
|
|
</thead>
|
|
<tbody class="inputs">
|
|
[% FOREACH input IN jobset.jobsetinputs %]
|
|
[% INCLUDE renderJobsetInput input=input baseName="input-$input.name" %]
|
|
[% END %]
|
|
<tr>
|
|
<td colspan="3" style="text-align: center;"><button type="button" class="add-input btn btn-success"><i class="icon-plus icon-white"></i> Add a new input</button></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
[% END %]
|
|
|
|
<form class="form-horizontal" action="[% IF create %][% c.uri_for('/project' project.name 'create-jobset/submit') %][% ELSE %][% c.uri_for('/jobset' project.name jobset.name 'submit') %][% END %]" method="post">
|
|
|
|
<fieldset>
|
|
|
|
<div class="control-group">
|
|
<div class="controls">
|
|
<label class="checkbox">
|
|
<input type="checkbox" name="enabled" [% IF jobset.enabled; 'checked="checked"'; END %]/>Enabled
|
|
</label>
|
|
</div>
|
|
<div class="controls">
|
|
<label class="checkbox">
|
|
<input type="checkbox" name="visible" [% IF !jobset.hidden; 'checked="checked"'; END %]/>Visible
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="control-group">
|
|
<label class="control-label">Identifier</label>
|
|
<div class="controls">
|
|
<input type="text" class="span3" name="name" [% HTML.attributes(value => jobset.name) %]/>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="control-group">
|
|
<label class="control-label">Description</label>
|
|
<div class="controls">
|
|
<input type="text" class="span3" name="description" [% HTML.attributes(value => jobset.description) %]/>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="control-group">
|
|
<label class="control-label">Nix expression</label>
|
|
<div class="controls">
|
|
<input type="text" class="span3" name="nixexprpath" [% HTML.attributes(value => jobset.nixexprpath) %]/>
|
|
in
|
|
<input type="text" class="span3" name="nixexprinput" [% HTML.attributes(value => jobset.nixexprinput) %]/>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="control-group">
|
|
<label class="control-label">Check interval</label>
|
|
<div class="controls">
|
|
<div class="input-append">
|
|
<input type="number" class="span3" name="checkinterval" [% HTML.attributes(value => jobset.checkinterval) %]/>
|
|
<span class="add-on">sec</span>
|
|
</div>
|
|
<span class="help-inline">(0 to disable polling)</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="control-group">
|
|
<label class="control-label">Scheduling shares</label>
|
|
<div class="controls">
|
|
<div class="input-append">
|
|
<input type="number" class="span3" name="schedulingshares" [% HTML.attributes(value => jobset.schedulingshares) %]/>
|
|
</div>
|
|
[% IF totalShares %]
|
|
<span class="help-inline">([% f = format("%.2f"); f(jobset.schedulingshares / totalShares * 100) %]% out of [% totalShares %] shares)</span>
|
|
[% END %]
|
|
</div>
|
|
</div>
|
|
|
|
<div class="control-group">
|
|
<div class="controls">
|
|
<label class="checkbox">
|
|
<input type="checkbox" name="enableemail" [% IF jobset.enableemail; 'checked="checked"'; END %]/>Email notification
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="control-group">
|
|
<label class="control-label">Email override</label>
|
|
<div class="controls">
|
|
<input type="text" class="span3" name="emailoverride" [% HTML.attributes(value => jobset.emailoverride) %]/>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="control-group">
|
|
<label class="control-label">Number of evaluations to keep</label>
|
|
<div class="controls">
|
|
<input type="number" class="span3" name="keepnr" [% HTML.attributes(value => jobset.keepnr) %]/>
|
|
</div>
|
|
</div>
|
|
|
|
[% INCLUDE renderJobsetInputs %]
|
|
|
|
<div class="form-actions">
|
|
<button type="submit" class="btn btn-primary"><i class="icon-ok icon-white"></i> [%IF create %]Create[% ELSE %]Apply changes[% END %]</button>
|
|
|
|
[% IF !create %]
|
|
<button id="delete-jobset" type="submit" class="btn btn-danger" name="submit" value="delete">
|
|
<i class="icon-trash icon-white"></i>
|
|
Delete this jobset
|
|
</button>
|
|
<script type="text/javascript">
|
|
$("#delete-jobset").click(function() {
|
|
return confirm("Are you sure you want to delete this jobset?");
|
|
});
|
|
</script>
|
|
[% END %]
|
|
</div>
|
|
|
|
</fieldset>
|
|
|
|
<table style="display: none">
|
|
[% INCLUDE renderJobsetInput input="" extraClass="template" id="input-template" baseName="input-template" %]
|
|
</table>
|
|
|
|
<tt class="inputalt" id="inputalt-template" style="display: none">
|
|
[% INCLUDE renderJobsetInputAlt alt=alt %]
|
|
</tt>
|
|
|
|
<script type="text/javascript">
|
|
$(document).ready(function() {
|
|
var id = 0;
|
|
|
|
$(".add-input").click(function() {
|
|
var newid = "input-" + id++;
|
|
var x = $("#input-template").clone(true).attr("id", "").insertBefore($(this).parents("tr")).show();
|
|
$("#input-template-name", x).attr("name", newid + "-name");
|
|
$("#input-template-type", x).attr("name", newid + "-type");
|
|
$("#input-template", x).attr("id", newid);
|
|
return false;
|
|
});
|
|
|
|
$(".add-inputalt").click(function() {
|
|
var x = $("#inputalt-template").clone(true).insertBefore($(this)).attr("id", "").show();
|
|
$("input", x).attr("name", x.parents(".inputalts").attr("id") + "-values");
|
|
});
|
|
});
|
|
</script>
|
|
|
|
</form>
|
|
|
|
[% END %]
|