Switch CI to Nix flakes

We also move tests to Flakes.

This would allow users to submit PRs with a fork of nixpkgs when they
want to test nixpkgs PRs against SNM.
This commit is contained in:
Antoine Eiche 2021-07-10 16:05:25 +02:00
parent fb182d52f6
commit 243bc2926b
5 changed files with 85 additions and 92 deletions

View file

@ -8,56 +8,26 @@ let
{ enabled = 1; { enabled = 1;
hidden = false; hidden = false;
description = "PR ${num}: ${info.title}"; description = "PR ${num}: ${info.title}";
nixexprinput = "snm";
nixexprpath = ".hydra/default.nix";
checkinterval = 30; checkinterval = 30;
schedulingshares = 20; schedulingshares = 20;
enableemail = false; enableemail = false;
emailoverride = ""; emailoverride = "";
keepnr = 1; keepnr = 1;
type = 0; type = 1;
inputs = { flake = "gitlab:simple-nixos-mailserver/nixos-mailserver/merge-requests/${info.iid}/head";
# This is only used to allow Niv to use pkgs.fetchzip which is
# required because of Hydra restricted evaluation mode.
nixpkgs = {
value = "https://github.com/NixOS/nixpkgs b6eefa48d8e10491e43c0c6155ac12b463f6fed3";
type = "git";
emailresponsible = false;
};
snm = {
type = "git";
value = "${info.target_repo_url} merge-requests/${info.iid}/head";
emailresponsible = false;
};
};
} }
) prs; ) prs;
mkJobset = branch: { mkJobset = branch: {
description = "Build ${branch} branch of Simple NixOS MailServer"; description = "Build ${branch} branch of Simple NixOS MailServer";
checkinterval = "60"; checkinterval = "60";
enabled = "1"; enabled = "1";
nixexprinput = "snm";
nixexprpath = ".hydra/default.nix";
schedulingshares = 100; schedulingshares = 100;
enableemail = false; enableemail = false;
emailoverride = ""; emailoverride = "";
keepnr = 3; keepnr = 3;
hidden = false; hidden = false;
type = 0; type = 1;
inputs = { flake = "gitlab:simple-nixos-mailserver/nixos-mailserver/${branch}";
# This is only used to allow Niv to use pkgs.fetchzip which is
# required because of Hydra restricted evaluation mode.
nixpkgs = {
value = "https://github.com/NixOS/nixpkgs b6eefa48d8e10491e43c0c6155ac12b463f6fed3";
type = "git";
emailresponsible = false;
};
snm = {
value = "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver ${branch}";
type = "git";
emailresponsible = false;
};
};
}; };
desc = prJobsets // { desc = prJobsets // {
@ -68,10 +38,20 @@ let
"nixos-21.05" = mkJobset "nixos-21.05"; "nixos-21.05" = mkJobset "nixos-21.05";
}; };
log = {
pulls = prs;
jobsets = desc;
};
in { in {
jobsets = pkgs.runCommand "spec-jobsets.json" {} '' jobsets = pkgs.runCommand "spec-jobsets.json" {} ''
cat >$out <<EOF cat >$out <<EOF
${builtins.toJSON desc} ${builtins.toJSON desc}
EOF EOF
# This is to get nice .jobsets build logs on Hydra
cat >tmp <<EOF
${builtins.toJSON log}
EOF
${pkgs.jq}/bin/jq . tmp
''; '';
} }

View file

@ -9,13 +9,23 @@ You can also chat with us on the Libera IRC channel ``#nixos-mailserver``.
Run NixOS tests Run NixOS tests
--------------- ---------------
You can run the testsuite via To run the test suite, you need to enable `Nix Flakes
<https://nixos.wiki/wiki/Flakes#Installing_flakes>`.
You can then run the testsuite via
:: ::
$ nix-build tests -A external.nixpkgs_20_03 $ nix flake check -L
$ nix-build tests -A internal.nixpkgs_unstable
... Since Nix doesn't garantee your machine have enough resources to run
all test VMs in parallel, some tests can fail. You would then haev to
run tests manually. For instance:
::
$ nix build .#hydraJobs.x86_64-linux.external-unstable -L
Contributing to the documentation Contributing to the documentation
--------------------------------- ---------------------------------

View file

@ -15,9 +15,25 @@
"type": "indirect" "type": "indirect"
} }
}, },
"nixpkgs-21_05": {
"locked": {
"lastModified": 1625692408,
"narHash": "sha256-e9L3TLLDVIJpMnHtiNHJE62oOh6emRtSZ244bgYJUZs=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c06613c25df3fe1dd26243847a3c105cf6770627",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-21.05",
"type": "indirect"
}
},
"root": { "root": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"nixpkgs-21_05": "nixpkgs-21_05",
"utils": "utils" "utils": "utils"
} }
}, },

View file

@ -4,15 +4,50 @@
inputs = { inputs = {
utils.url = "github:numtide/flake-utils"; utils.url = "github:numtide/flake-utils";
nixpkgs.url = "flake:nixpkgs/nixos-unstable"; nixpkgs.url = "flake:nixpkgs/nixos-unstable";
nixpkgs-21_05.url = "flake:nixpkgs/nixos-21.05";
}; };
outputs = { self, utils, nixpkgs }: { outputs = { self, utils, nixpkgs, nixpkgs-21_05 }: let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
# We want to test nixos-mailserver on several nixos releases
releases = [
{
name = "unstable";
pkgs = nixpkgs.legacyPackages.${system};
}
{
name = "21_05";
pkgs = nixpkgs-21_05.legacyPackages.${system};
}
];
testNames = [
"internal"
"external"
"clamav"
"multiple"
];
genTest = testName: release: {
"name"= "${testName}-${release.name}";
"value"= import (./tests/. + "/${testName}.nix") {
pkgs = release.pkgs;
};
};
# Generate an attribute set such as
# {
# external-unstable = <derivation>;
# external-21_05 = <derivation>;
# ...
# }
allTests = pkgs.lib.listToAttrs (
pkgs.lib.flatten (map (t: map (r: genTest t r) releases) testNames));
in {
nixosModules.mailserver = import ./.; nixosModules.mailserver = import ./.;
nixosModule = self.nixosModules.mailserver; nixosModule = self.nixosModules.mailserver;
} // utils.lib.eachDefaultSystem (system: let hydraJobs.${system} = allTests;
pkgs = nixpkgs.legacyPackages.${system}; checks.${system} = allTests;
in { devShell.${system} = pkgs.mkShell {
devShell = pkgs.mkShell {
buildInputs = with pkgs; [ buildInputs = with pkgs; [
(python3.withPackages (p: with p; [ (python3.withPackages (p: with p; [
sphinx sphinx
@ -22,5 +57,5 @@
clamav clamav
]; ];
}; };
}); };
} }

View file

@ -1,48 +0,0 @@
# Generate an attribute sets containing all tests for all releaeses
# It looks like:
# - external.nixpkgs_20.03
# - external.nixpkgs_unstable
# - internal.nixpkgs_20.03
# - internal.nixpkgs_unstable
with builtins;
let
sources = import ../nix/sources.nix;
releases = listToAttrs (map genRelease releaseNames);
genRelease = name: {
name = name;
value = import sources."${name}" {};
};
genTest = testName: release:
let
pkgs = releases."${release}";
test = pkgs.callPackage (./. + "/${testName}.nix") { };
in {
"name"= builtins.replaceStrings ["." "-"] ["_" "_"] release;
"value"= test;
};
releaseNames = [
"nixpkgs-unstable"
"nixpkgs-20.09"
"nixpkgs-21.05"
];
testNames = [
"internal"
"external"
"clamav"
"multiple"
];
# Generate an attribute set containing one test per releases
genTests = testName: {
name = testName;
value = listToAttrs (map (genTest testName) (builtins.attrNames releases));
};
in listToAttrs (map genTests testNames)