Compare commits

...

5 commits
master ... ci

Author SHA1 Message Date
Antoine Eiche
a21b582e79 Remove nixexprinput and nixexprpath 2021-07-12 22:49:35 +02:00
Antoine Eiche
dbcb2134e5 tests: update fts indexer log messages 2021-07-12 22:49:35 +02:00
Antoine Eiche
5ea1a74cb1 Remove Niv
It is now useless since we are using Nix Flakes
2021-07-12 22:49:35 +02:00
Antoine Eiche
e64542f984 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.
2021-07-12 22:49:35 +02:00
Antoine Eiche
fb182d52f6 remove me 2021-07-11 10:36:18 +02:00
12 changed files with 116 additions and 284 deletions

View file

@ -8,68 +8,50 @@ 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 // {
"ci" = mkJobset "ci";
"master" = mkJobset "master"; "master" = mkJobset "master";
"nixos-20.09" = mkJobset "nixos-20.09"; "nixos-20.09" = mkJobset "nixos-20.09";
"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

@ -12,7 +12,7 @@
"type": 0, "type": 0,
"inputs": { "inputs": {
"nixexpr": { "nixexpr": {
"value": "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver master", "value": "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver ci ",
"type": "git", "type": "git",
"emailresponsible": false "emailresponsible": false
}, },

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

@ -1,45 +0,0 @@
{
"blobs": {
"sha256": "1g687x3b2r4ar5i4xyav5qzpy9fp1phx9wf70f4j3scwny0g7hn1",
"type": "tarball",
"url": "https://gitlab.com/simple-nixos-mailserver/blobs/-/archive/2cccdf1ca48316f2cfd1c9a0017e8de5a7156265/blobs-2cccdf1ca48316f2cfd1c9a0017e8de5a7156265.tar.gz",
"url_template": "https://gitlab.com/simple-nixos-mailserver/blobs/-/archive/<version>/blobs-<version>.tar.gz",
"version": "2cccdf1ca48316f2cfd1c9a0017e8de5a7156265"
},
"nixpkgs-20.09": {
"branch": "release-20.09",
"description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
"homepage": "https://github.com/NixOS/nixpkgs",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b6eefa48d8e10491e43c0c6155ac12b463f6fed3",
"sha256": "0hrp7gshy62bsj719xd6hk6z284pzr8ksw1vvxvyfrffq1f7d8k9",
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs/archive/b6eefa48d8e10491e43c0c6155ac12b463f6fed3.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"nixpkgs-21.05": {
"branch": "release-21.05",
"description": "Nix Packages collection",
"homepage": "",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "3776ceb792907ddebd7d2603778c7f106fabfb08",
"sha256": "10wmmnf5scmrnf1knc31yhwlrq720n3k26j44daqal4shqxhr2vk",
"type": "tarball",
"url": "https://github.com/nixos/nixpkgs/archive/3776ceb792907ddebd7d2603778c7f106fabfb08.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"nixpkgs-unstable": {
"branch": "nixos-unstable",
"description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
"homepage": "https://github.com/NixOS/nixpkgs",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "1905f5f2e55e0db0bb6244cfe62cb6c0dbda391d",
"sha256": "148f79hhya66qj8v5gn7bs6zrfjy1nbvdciyxdm4yd5p8r6ayzv6",
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs/archive/1905f5f2e55e0db0bb6244cfe62cb6c0dbda391d.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
}
}

View file

@ -1,131 +0,0 @@
# This file has been generated by Niv.
let
#
# The fetchers. fetch_<type> fetches specs of type <type>.
#
fetch_file = pkgs: spec:
if spec.builtin or true then
builtins_fetchurl { inherit (spec) url sha256; }
else
pkgs.fetchurl { inherit (spec) url sha256; };
fetch_tarball = pkgs: spec:
pkgs.fetchzip { inherit (spec) url sha256; };
fetch_git = spec:
builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; };
fetch_builtin-tarball = spec:
builtins.trace
''
WARNING:
The niv type "builtin-tarball" will soon be deprecated. You should
instead use `builtin = true`.
$ niv modify <package> -a type=tarball -a builtin=true
''
builtins_fetchTarball { inherit (spec) url sha256; };
fetch_builtin-url = spec:
builtins.trace
''
WARNING:
The niv type "builtin-url" will soon be deprecated. You should
instead use `builtin = true`.
$ niv modify <package> -a type=file -a builtin=true
''
(builtins_fetchurl { inherit (spec) url sha256; });
#
# Various helpers
#
# The set of packages used when specs are fetched using non-builtins.
mkPkgs = sources:
let
sourcesNixpkgs =
import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {};
hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
hasThisAsNixpkgsPath = <nixpkgs> == ./.;
in
if builtins.hasAttr "nixpkgs" sources
then sourcesNixpkgs
else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then
import <nixpkgs> {}
else
abort
''
Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or
add a package called "nixpkgs" to your sources.json.
'';
# The actual fetching function.
fetch = pkgs: name: spec:
if ! builtins.hasAttr "type" spec then
abort "ERROR: niv spec ${name} does not have a 'type' attribute"
else if spec.type == "file" then fetch_file pkgs spec
else if spec.type == "tarball" then fetch_tarball pkgs spec
else if spec.type == "git" then fetch_git spec
else if spec.type == "builtin-tarball" then fetch_builtin-tarball spec
else if spec.type == "builtin-url" then fetch_builtin-url spec
else
abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}";
# Ports of functions for older nix versions
# a Nix version of mapAttrs if the built-in doesn't exist
mapAttrs = builtins.mapAttrs or (
f: set: with builtins;
listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set))
);
# fetchTarball version that is compatible between all the versions of Nix
builtins_fetchTarball = { url, sha256 }@attrs:
let
inherit (builtins) lessThan nixVersion fetchTarball;
in
if lessThan nixVersion "1.12" then
fetchTarball { inherit url; }
else
fetchTarball attrs;
# fetchurl version that is compatible between all the versions of Nix
builtins_fetchurl = { url, sha256 }@attrs:
let
inherit (builtins) lessThan nixVersion fetchurl;
in
if lessThan nixVersion "1.12" then
fetchurl { inherit url; }
else
fetchurl attrs;
# Create the final "sources" from the config
mkSources = config:
mapAttrs (
name: spec:
if builtins.hasAttr "outPath" spec
then abort
"The values in sources.json should not have an 'outPath' attribute"
else
spec // { outPath = fetch config.pkgs name spec; }
) config.sources;
# The "config" used by the fetchers
mkConfig =
{ sourcesFile ? ./sources.json
, sources ? builtins.fromJSON (builtins.readFile sourcesFile)
, pkgs ? mkPkgs sources
}: rec {
# The sources, i.e. the attribute set of spec name to spec
inherit sources;
# The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
inherit pkgs;
};
in
mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }

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";
@ -489,12 +489,10 @@ pkgs.nixosTest {
client.fail("search Junk a >&2") client.fail("search Junk a >&2")
# check that search really goes through the indexer # check that search really goes through the indexer
server.succeed( server.succeed(
"journalctl -u dovecot2 | grep -E 'indexer-worker.* Mailbox INBOX: Indexed' >&2" "journalctl -u dovecot2 | grep -E 'indexer-worker.* Mailbox INBOX: Mailbox opened because: indexing' >&2"
) )
# check that Junk is not indexed # check that Junk is not indexed
server.fail( server.fail("journalctl -u dovecot2 | grep 'indexer-worker' | grep -i 'JUNK' >&2")
"journalctl -u dovecot2 | grep -E 'indexer-worker.* Mailbox JUNK: Indexed' >&2"
)
with subtest("no warnings or errors"): with subtest("no warnings or errors"):
server.fail("journalctl -u postfix | grep -i error >&2") server.fail("journalctl -u postfix | grep -i error >&2")

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