nixpkgs/nixos/tests/hydra/default.nix

101 lines
3.2 KiB
Nix
Raw Normal View History

{ system ? builtins.currentSystem
, config ? { }
, pkgs ? import ../../.. { inherit system config; }
}:
let
trivialJob = pkgs.writeTextDir "trivial.nix" ''
{ trivial = builtins.derivation {
name = "trivial";
system = "${system}";
builder = "/bin/sh";
allowSubstitutes = false;
preferLocalBuild = true;
args = ["-c" "echo success > $out; exit 0"];
};
}
'';
createTrivialProject = pkgs.stdenv.mkDerivation {
name = "create-trivial-project";
2019-06-19 16:45:34 +01:00
dontUnpack = true;
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}
hydra: 2017-11-21 -> 2018-08-07 This bumps Hydra to the latest revision available. As Hydra doesn't have a release model (and therefore no tags) ATM, the derivation will pin against the actual git revision and the date of the commit in the derivation name. Additionally the following changes have been made: * Dropped `postUnpack` phase. It is useful when working with the Hydra source (and no dirty changes shall be used in `release.nix`, but is has no use in `nixpkgs`). * Added myself as maintainer to have more folks available in case of future breakage. * Implemented support for Nix 2.0 and `unstable` (currently 2.1): Since 1672bcd230447f1ce0c3291950bdd9a662cee974 in NixOS/nix the evaluator differentiates between `settings` and `evalSettings`. Previously `restrictEval` in `hydra-eval-jobs.cc` has been set in `settings`, this doesn't work anymore in Nix 2.1 and is therefore incompatible to Nix 2.0 on an API level. To resolve this, the flag `isGreaterNix20` parses the version string of `pkgs.nix` and applies a patch if nix.version<=2.0. Furthermore the Hydra build with Nix 2.1 requires `boost` as build input which is not needed for Nix 2.0. To avoid unnecessary increase in the closure size this library will only used as build input for nix.version>2.0. * Fixed the NixOS test for `hydra`: disabled binary cache to allow sandbox builds (otherwise it would query `cache.nixos.org` during the Hydra build inside the test). Additionally the trivial.nix jobset required simplification (as done in NixOS/hydra, e.g. tests/api-test.nix) as bash is not available in the build sandbox as builder (even when adding pkgs.bash to systemPackages). The easiest workaround to confirm a the functionality of a jobset without importing nixpkgs is to use the default shell /bin/sh which is mounted from `pkgs.busybox` into the build env (https://github.com/NixOS/nixpkgs/pull/44841#discussion_r209751972) in the VM and a named pipe to create $out. Closes #44044
2018-08-09 21:32:27 +01:00
'';
};
callTest = f: f { inherit system pkgs; };
hydraPkgs = {
inherit (pkgs) nixStable nixUnstable;
};
tests = pkgs.lib.flip pkgs.lib.mapAttrs hydraPkgs (name: nix:
callTest (import ../make-test.nix ({ pkgs, lib, ... }:
{
name = "hydra-with-${name}";
meta = with pkgs.stdenv.lib.maintainers; {
maintainers = [ pstn lewo ma27 ];
};
machine = { 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";
package = pkgs.hydra.override { inherit nix; };
extraConfig = ''
email_notification = 1
'';
};
services.postfix.enable = true;
nix = {
buildMachines = [{
hostName = "localhost";
systems = [ system ];
}];
binaryCaches = [];
};
};
testScript = ''
# let the system boot up
$machine->waitForUnit("multi-user.target");
# test whether the database is running
$machine->waitForUnit("postgresql.service");
# test whether the actual hydra daemons are running
$machine->waitForUnit("hydra-init.service");
$machine->requireActiveUnit("hydra-queue-runner.service");
$machine->requireActiveUnit("hydra-evaluator.service");
$machine->requireActiveUnit("hydra-notify.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');
$machine->waitUntilSucceeds('journalctl -eu hydra-notify.service -o cat | grep -q "sending mail notification to hydra@localhost"');
'';
})));
in
tests