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 a9f87ca461
commit a0f9688a31
9 changed files with 111 additions and 103 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 // {
@ -66,10 +36,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

@ -1,5 +1,21 @@
{ {
"nodes": { "nodes": {
"blobs": {
"flake": false,
"locked": {
"lastModified": 1604995301,
"narHash": "sha256-wcLzgLec6SGJA8fx1OEN1yV/Py5b+U5iyYpksUY/yLw=",
"owner": "simple-nixos-mailserver",
"repo": "blobs",
"rev": "2cccdf1ca48316f2cfd1c9a0017e8de5a7156265",
"type": "gitlab"
},
"original": {
"owner": "simple-nixos-mailserver",
"repo": "blobs",
"type": "gitlab"
}
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1607522989, "lastModified": 1607522989,
@ -15,9 +31,26 @@
"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": {
"blobs": "blobs",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"nixpkgs-21_05": "nixpkgs-21_05",
"utils": "utils" "utils": "utils"
} }
}, },

View File

@ -4,15 +4,55 @@
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";
blobs = {
url = "gitlab:simple-nixos-mailserver/blobs";
flake = false;
};
}; };
outputs = { self, utils, nixpkgs }: { outputs = { self, utils, blobs, 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;
inherit blobs;
};
};
# 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 +62,5 @@
clamav clamav
]; ];
}; };
}); };
} }

View File

@ -14,19 +14,12 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/> # along with this program. If not, see <http://www.gnu.org/licenses/>
{ pkgs ? import <nixpkgs> {}}: { pkgs ? import <nixpkgs> {}, blobs}:
pkgs.nixosTest { pkgs.nixosTest {
name = "clamav"; name = "clamav";
nodes = { nodes = {
server = { config, pkgs, lib, ... }: server = { config, pkgs, lib, ... }:
let
sources = import ../nix/sources.nix;
blobs = pkgs.fetchzip {
url = sources.blobs.url;
sha256 = sources.blobs.sha256;
};
in
{ {
imports = [ imports = [
../default.nix ../default.nix

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)

View File

@ -14,7 +14,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/> # along with this program. If not, see <http://www.gnu.org/licenses/>
{ pkgs ? import <nixpkgs> {}}: { pkgs ? import <nixpkgs> {}, ...}:
pkgs.nixosTest { pkgs.nixosTest {
name = "external"; name = "external";

View File

@ -14,7 +14,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/> # along with this program. If not, see <http://www.gnu.org/licenses/>
{ pkgs ? import <nixpkgs> {}}: { pkgs ? import <nixpkgs> {}, ...}:
let let
sendMail = pkgs.writeTextFile { sendMail = pkgs.writeTextFile {

View File

@ -1,6 +1,6 @@
# This tests is used to test features requiring several mail domains. # This tests is used to test features requiring several mail domains.
{ pkgs ? import <nixpkgs> {}}: { pkgs ? import <nixpkgs> {}, ...}:
let let
hashPassword = password: pkgs.runCommand hashPassword = password: pkgs.runCommand