2024-04-20 13:23:49 -04:00
|
|
|
{
|
|
|
|
nixpkgs,
|
|
|
|
pulls,
|
2024-04-20 13:34:25 -04:00
|
|
|
branches,
|
|
|
|
|
2024-04-20 13:23:49 -04:00
|
|
|
...
|
|
|
|
}:
|
2024-04-03 02:34:17 -04:00
|
|
|
let
|
|
|
|
pkgs = import nixpkgs { };
|
|
|
|
|
2024-04-20 13:23:49 -04:00
|
|
|
makeSpec =
|
|
|
|
contents:
|
|
|
|
builtins.derivation {
|
|
|
|
name = "spec.json";
|
|
|
|
system = "x86_64-linux";
|
|
|
|
preferLocalBuild = true;
|
|
|
|
allowSubstitutes = false;
|
|
|
|
builder = "/bin/sh";
|
|
|
|
args = [
|
|
|
|
(builtins.toFile "builder.sh" ''
|
|
|
|
echo "$contents" > $out
|
|
|
|
'')
|
|
|
|
];
|
|
|
|
contents = builtins.toJSON contents;
|
|
|
|
};
|
2024-04-03 02:34:17 -04:00
|
|
|
|
2024-04-20 15:21:40 -04:00
|
|
|
prs = readJSONFile pulls;
|
|
|
|
refs = readJSONFile branches;
|
2024-04-20 13:23:49 -04:00
|
|
|
repo = "ahuston-0/nix-dotfiles-hydra";
|
2024-04-03 02:34:17 -04:00
|
|
|
|
2024-04-20 13:23:49 -04:00
|
|
|
makeJob =
|
|
|
|
{
|
|
|
|
schedulingshares ? 10,
|
|
|
|
keepnr ? 3,
|
|
|
|
description,
|
|
|
|
flake,
|
|
|
|
}:
|
|
|
|
{
|
|
|
|
inherit
|
|
|
|
description
|
|
|
|
flake
|
|
|
|
schedulingshares
|
|
|
|
keepnr
|
|
|
|
;
|
|
|
|
enabled = 1;
|
|
|
|
type = 1;
|
|
|
|
hidden = false;
|
|
|
|
checkinterval = 300; # every 6 months
|
|
|
|
enableemail = false;
|
|
|
|
emailoverride = "";
|
|
|
|
};
|
|
|
|
jobOfRef =
|
|
|
|
name:
|
|
|
|
{ ref, ... }:
|
2024-04-20 15:23:12 -04:00
|
|
|
if isNull (builtins.match "^refs/heads/(.*)$" ref) then
|
2024-04-20 13:23:49 -04:00
|
|
|
null
|
|
|
|
else
|
|
|
|
{
|
|
|
|
name = "branch-${name}";
|
|
|
|
value = makeJob {
|
|
|
|
description = "Branch ${name}";
|
|
|
|
flake = "git+ssh://git@github.com/${repo}?ref=${ref}";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
jobOfPR = id: info: {
|
|
|
|
name = "pr-${id}";
|
|
|
|
value = makeJob {
|
2024-04-20 15:21:40 -04:00
|
|
|
description = "PR ${id}: ${info.title}";
|
|
|
|
flake = "git+ssh://git@github.com/${info.head.repo.full_name}?ref=${info.head.ref}";
|
2024-04-20 13:23:49 -04:00
|
|
|
};
|
2024-04-03 02:34:17 -04:00
|
|
|
};
|
2024-04-20 13:23:49 -04:00
|
|
|
attrsToList = l: builtins.attrValues (builtins.mapAttrs (name: value: { inherit name value; }) l);
|
|
|
|
readJSONFile = f: builtins.fromJSON (builtins.readFile f);
|
|
|
|
mapFilter = f: l: builtins.filter (x: !(isNull x)) (map f l);
|
2024-04-20 15:41:38 -04:00
|
|
|
jobs = makeSpec (
|
2024-04-20 15:25:36 -04:00
|
|
|
builtins.listToAttrs (map ({ name, value }: jobOfPR name value) (attrsToList prs))
|
|
|
|
// builtins.listToAttrs (mapFilter ({ name, value }: jobOfRef name value) (attrsToList refs))
|
2024-04-20 13:23:49 -04:00
|
|
|
// {
|
|
|
|
main = makeJob {
|
|
|
|
description = "main";
|
|
|
|
flake = "github:${repo}";
|
|
|
|
keepnr = 10;
|
|
|
|
schedulingshares = 100;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
);
|
2024-04-20 15:41:38 -04:00
|
|
|
log = {
|
|
|
|
jobsets = jobs;
|
|
|
|
};
|
|
|
|
in
|
|
|
|
{
|
|
|
|
jobsets =
|
|
|
|
jobs
|
|
|
|
// pkgs.runCommand "spec-jobsets.json" { } ''
|
|
|
|
cat >$out <<EOF
|
|
|
|
${prs}
|
|
|
|
${refs}
|
|
|
|
${jobs}
|
|
|
|
EOF
|
|
|
|
# This is to get nice .jobsets build logs on Hydra
|
|
|
|
cat >tmp <<EOF
|
|
|
|
${builtins.toJSON log}
|
|
|
|
EOF
|
|
|
|
${pkgs.jq}/bin/jq . tmp
|
|
|
|
'';
|
2024-04-03 02:34:17 -04:00
|
|
|
}
|