declarative projects: support fully static, declarative configuration
[?]
Sep 2, 2020, 4:34 PM
BCFAS6VOEDLANURVQYMHK4FQY5JMBD6U2KMRZKS2T73LBP4T3QIACDependencies
- [2]
5PXVIXLHDeclarative projects: Include the fetch info for the declarative input in the project eval - [3]
VDT6CUITdoc: add basic docs about declarative projects - [4]
CUFVKLLARemove Hydra::Helper::nix::txn_do from the Perl code - [5]
CQZQE32VImprove handling of Perl's block eval errors - [6]
HEZQ273Simprove the error messages when invalid declarative jobsets are defined - [7]
6WRGCITDEnable declarative projects. - [8]
L54KA7IMhandleDeclarativeJobsetBuild: handle errors from readNixFile - [*]
OOQ2D3KC* Refactoring: move fetchInput out of hydra_scheduler into a separate - [*]
BMSQD2ZHIndentation - [*]
N22GPKYT* Put info about logs / build products in the DB.
Change contents
- edit in doc/manual/declarative-projects.xml at line 4
<title>Declarative projects</title><para>Hydra supports declaratively configuring a project's jobsets. Thisconfiguration can be done statically, or generated by a build job.</para><note><para>Hydra will treat the project's declarative input as a static definitionif and only if the spec file contains a dictionary of dictionaries.If the value of any key in the spec is not a dictionary, it willtreat the spec as a generated declarative spec.</para></note><section xml:id="sec-static-declarative-projects"><title>Static, Declarative Projects</title><para>Hydra supports declarative projects, where jobsets are configuredfrom a static JSON document in a repository.</para><para>To configure a static declarative project, take the following steps:</para><orderedlist numeration="arabic" spacing="compact"><listitem><para>Create a Hydra-fetchable source like a Git repository or local path.</para></listitem><listitem><para>In that source, create a file called <filename>spec.json</filename>,and add the specification for all of the jobsets. Each key is jobsetand each value is a jobset's specification. For example: - replacement in doc/manual/declarative-projects.xml at line 42
<title>Declarative projects</title><programlisting language="json">{"nixpkgs": {"enabled": 1,"hidden": false,"description": "Nixpkgs","nixexprinput": "nixpkgs","nixexprpath": "pkgs/top-level/release.nix","checkinterval": 300,"schedulingshares": 100,"enableemail": false,"emailoverride": "","keepnr": 3,"inputs": {"nixpkgs": {"type": "git","value": "git://github.com/NixOS/nixpkgs.git master","emailresponsible": false}}},"nixos": {"enabled": 1,"hidden": false,"description": "NixOS: Small Evaluation","nixexprinput": "nixpkgs","nixexprpath": "nixos/release-small.nix","checkinterval": 300,"schedulingshares": 100,"enableemail": false,"emailoverride": "","keepnr": 3,"inputs": {"nixpkgs": {"type": "git","value": "git://github.com/NixOS/nixpkgs.git master","emailresponsible": false}}}}</programlisting></para></listitem><listitem><para>Create a new project, and set the project's declarative input type,declarative input value, and declarative spec file to point to thesource and JSON file you created in step 2.</para></listitem></orderedlist> - replacement in doc/manual/declarative-projects.xml at line 95
Hydra also supports declarative projects, where jobsets are generatedand configured automatically from specification files instead of beingHydra will create a special jobset named <literal>.jobsets</literal>.When the <literal>.jobsets</literal> jobset is evaluated, this staticspecification will be used for configuring the rest of the project'sjobsets.</para></section><section xml:id="sec-generated-declarative-projects"><title>Generated, Declarative Projects</title><para><para>Hydra also supports generated declarative projects, where jobsets areconfigured automatically from specification files instead of being - edit in doc/manual/declarative-projects.xml at line 197[3.3832]
</section> - edit in src/lib/Hydra/Helper/AddBuilds.pm at line 24
handleDeclarativeJobsetJson - edit in src/lib/Hydra/Helper/AddBuilds.pm at line 69
sub handleDeclarativeJobsetJson {my ($db, $project, $declSpec) = @_;$db->txn_do(sub {my @kept = keys %$declSpec;push @kept, ".jobsets";$project->jobsets->search({ name => { "not in" => \@kept } })->update({ enabled => 0, hidden => 1 });while ((my $jobsetName, my $spec) = each %$declSpec) {eval {updateDeclarativeJobset($db, $project, $jobsetName, $spec);1;} or do {print STDERR "ERROR: failed to process declarative jobset ", $project->name, ":${jobsetName}, ", $@, "\n";}}});} - replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 102[6.2344]→[4.692:718](∅→∅),[4.718]→[6.2370:2627](∅→∅),[6.2370]→[6.2370:2627](∅→∅),[6.2627]→[6.0:103](∅→∅),[6.103]→[5.106:155](∅→∅),[5.155]→[6.148:293](∅→∅),[6.148]→[6.148:293](∅→∅),[6.293]→[6.2703:2729](∅→∅),[6.2703]→[6.2703:2729](∅→∅)
$db->txn_do(sub {my @kept = keys %$declSpec;push @kept, ".jobsets";$project->jobsets->search({ name => { "not in" => \@kept } })->update({ enabled => 0, hidden => 1 });while ((my $jobsetName, my $spec) = each %$declSpec) {eval {updateDeclarativeJobset($db, $project, $jobsetName, $spec);1;} or do {print STDERR "ERROR: failed to process declarative jobset ", $project->name, ":${jobsetName}, ", $@, "\n";}}});handleDeclarativeJobsetJson($db, $project, $declSpec); - edit in src/script/hydra-eval-jobset at line 572
- replacement in src/script/hydra-eval-jobset at line 574
updateDeclarativeJobset($db, $project, ".jobsets", $declSpec);$jobset->discard_changes;$inputInfo->{"declInput"} = [ $declInput ];if (ref $declSpec eq "HASH") {if (grep ref $_ eq "HASH", values %$declSpec) {# Since all of its keys are hashes, assume the json document# itself is the entire set of jobshandleDeclarativeJobsetJson($db, $project, $declSpec);$db->txn_do(sub {$jobset->update({ lastcheckedtime => time, fetcherrormsg => undef });});return;} else {# Update the jobset with the spec's inputs, and the continue# evaluating the .jobsets jobset.updateDeclarativeJobset($db, $project, ".jobsets", $declSpec);$jobset->discard_changes;$inputInfo->{"declInput"} = [ $declInput ];}} else {die "Declarative specification file $declFile is not a dictionary"}