Merge pull request #40729 from nlewo/pr-hydra-test

nixos/tests/hydra: build a trivial derivation

Changed files
+135 -32
nixos
+1
nixos/release.nix
···
tests.home-assistant = callTest tests/home-assistant.nix { };
tests.hound = callTest tests/hound.nix {};
tests.hocker-fetchdocker = callTest tests/hocker-fetchdocker {};
+
tests.hydra = callTest tests/hydra {};
tests.i3wm = callTest tests/i3wm.nix {};
tests.iftop = callTest tests/iftop.nix {};
tests.initrd-network-ssh = callTest tests/initrd-network-ssh {};
-32
nixos/tests/hydra.nix
···
-
import ./make-test.nix ({ pkgs, ...} : {
-
name = "hydra-init-localdb";
-
meta = with pkgs.stdenv.lib.maintainers; {
-
maintainers = [ pstn ];
-
};
-
-
machine =
-
{ config, pkgs, ... }:
-
-
{
-
services.hydra = {
-
enable = true;
-
-
#Hydra needs those settings to start up, so we add something not harmfull.
-
hydraURL = "example.com";
-
notificationSender = "example@example.com";
-
};
-
};
-
-
testScript =
-
''
-
# let the system boot up
-
$machine->waitForUnit("multi-user.target");
-
# test whether the database is running
-
$machine->succeed("systemctl status postgresql.service");
-
# test whether the actual hydra daemons are running
-
$machine->succeed("systemctl status hydra-queue-runner.service");
-
$machine->succeed("systemctl status hydra-init.service");
-
$machine->succeed("systemctl status hydra-evaluator.service");
-
$machine->succeed("systemctl status hydra-send-stats.service");
-
'';
-
})
+56
nixos/tests/hydra/create-trivial-project.sh
···
+
#!/usr/bin/env bash
+
#
+
# This script creates a project, a jobset with an input of type local
+
# path. This local path is a directory that contains a Nix expression
+
# to define a job.
+
# The EXPR-PATH environment variable must be set with the local path.
+
+
set -e
+
+
URL=http://localhost:3000
+
USERNAME="admin"
+
PASSWORD="admin"
+
PROJECT_NAME="trivial"
+
JOBSET_NAME="trivial"
+
EXPR_PATH=${EXPR_PATH:-}
+
+
if [ -z $EXPR_PATH ]; then
+
echo "Environment variable EXPR_PATH must be set"
+
exit 1
+
fi
+
+
mycurl() {
+
curl --referer $URL -H "Accept: application/json" -H "Content-Type: application/json" $@
+
}
+
+
cat >data.json <<EOF
+
{ "username": "$USERNAME", "password": "$PASSWORD" }
+
EOF
+
mycurl -X POST -d '@data.json' $URL/login -c hydra-cookie.txt
+
+
cat >data.json <<EOF
+
{
+
"displayname":"Trivial",
+
"enabled":"1"
+
}
+
EOF
+
mycurl --silent -X PUT $URL/project/$PROJECT_NAME -d @data.json -b hydra-cookie.txt
+
+
cat >data.json <<EOF
+
{
+
"description": "Trivial",
+
"checkinterval": "60",
+
"enabled": "1",
+
"visible": "1",
+
"keepnr": "1",
+
"nixexprinput": "trivial",
+
"nixexprpath": "trivial.nix",
+
"inputs": {
+
"trivial": {
+
"value": "$EXPR_PATH",
+
"type": "path"
+
}
+
}
+
}
+
EOF
+
mycurl --silent -X PUT $URL/jobset/$PROJECT_NAME/$JOBSET_NAME -d @data.json -b hydra-cookie.txt
+78
nixos/tests/hydra/default.nix
···
+
import ../make-test.nix ({ pkgs, ...} :
+
+
let
+
trivialJob = pkgs.writeTextDir "trivial.nix" ''
+
with import <nix/config.nix>;
+
+
{ trivial = builtins.derivation {
+
name = "trivial";
+
system = "x86_64-linux";
+
PATH = coreutils;
+
builder = shell;
+
args = ["-c" "touch $out; exit 0"];
+
};
+
}
+
'';
+
+
createTrivialProject = pkgs.stdenv.mkDerivation {
+
name = "create-trivial-project";
+
unpackPhase = ":";
+
buildInputs = [ pkgs.makeWrapper ];
+
installPhase = "install -m755 -D ${./create-trivial-project.sh} $out/bin/create-trivial-project.sh";
+
postFixup = ''
+
wrapProgram "$out/bin/create-trivial-project.sh" --prefix PATH ":" ${pkgs.stdenv.lib.makeBinPath [ pkgs.curl ]} --set EXPR_PATH ${trivialJob}
+
'';
+
};
+
+
in {
+
name = "hydra-init-localdb";
+
meta = with pkgs.stdenv.lib.maintainers; {
+
maintainers = [ pstn lewo ];
+
};
+
+
machine =
+
{ config, pkgs, ... }:
+
+
{
+
virtualisation.memorySize = 1024;
+
time.timeZone = "UTC";
+
+
environment.systemPackages = [ createTrivialProject pkgs.jq ];
+
services.hydra = {
+
enable = true;
+
+
#Hydra needs those settings to start up, so we add something not harmfull.
+
hydraURL = "example.com";
+
notificationSender = "example@example.com";
+
};
+
nix = {
+
buildMachines = [{
+
hostName = "localhost";
+
systems = [ "x86_64-linux" ];
+
}];
+
};
+
};
+
+
testScript =
+
''
+
# let the system boot up
+
$machine->waitForUnit("multi-user.target");
+
# test whether the database is running
+
$machine->succeed("systemctl status postgresql.service");
+
# test whether the actual hydra daemons are running
+
$machine->succeed("systemctl status hydra-queue-runner.service");
+
$machine->succeed("systemctl status hydra-init.service");
+
$machine->succeed("systemctl status hydra-evaluator.service");
+
$machine->succeed("systemctl status hydra-send-stats.service");
+
+
$machine->succeed("hydra-create-user admin --role admin --password admin");
+
+
# create a project with a trivial job
+
$machine->waitForOpenPort(3000);
+
+
# make sure the build as been successfully built
+
$machine->succeed("create-trivial-project.sh");
+
+
$machine->waitUntilSucceeds('curl -L -s http://localhost:3000/build/1 -H "Accept: application/json" | jq .buildstatus | xargs test 0 -eq');
+
'';
+
})