From 243bc2926b34efd5bafa8cbc34c6cd1c1245e29c Mon Sep 17 00:00:00 2001 From: Antoine Eiche Date: Sat, 10 Jul 2021 16:05:25 +0200 Subject: [PATCH] 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. --- .hydra/declarative-jobsets.nix | 48 ++++++++++------------------------ docs/howto-develop.rst | 18 ++++++++++--- flake.lock | 16 ++++++++++++ flake.nix | 47 ++++++++++++++++++++++++++++----- tests/default.nix | 48 ---------------------------------- 5 files changed, 85 insertions(+), 92 deletions(-) delete mode 100644 tests/default.nix diff --git a/.hydra/declarative-jobsets.nix b/.hydra/declarative-jobsets.nix index ef3d289..bede116 100644 --- a/.hydra/declarative-jobsets.nix +++ b/.hydra/declarative-jobsets.nix @@ -8,56 +8,26 @@ let { enabled = 1; hidden = false; description = "PR ${num}: ${info.title}"; - nixexprinput = "snm"; - nixexprpath = ".hydra/default.nix"; checkinterval = 30; schedulingshares = 20; enableemail = false; emailoverride = ""; keepnr = 1; - type = 0; - inputs = { - # 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; - }; - }; + type = 1; + flake = "gitlab:simple-nixos-mailserver/nixos-mailserver/merge-requests/${info.iid}/head"; } ) prs; mkJobset = branch: { description = "Build ${branch} branch of Simple NixOS MailServer"; checkinterval = "60"; enabled = "1"; - nixexprinput = "snm"; - nixexprpath = ".hydra/default.nix"; schedulingshares = 100; enableemail = false; emailoverride = ""; keepnr = 3; hidden = false; - type = 0; - inputs = { - # 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; - }; - }; + type = 1; + flake = "gitlab:simple-nixos-mailserver/nixos-mailserver/${branch}"; }; desc = prJobsets // { @@ -68,10 +38,20 @@ let "nixos-21.05" = mkJobset "nixos-21.05"; }; + log = { + pulls = prs; + jobsets = desc; + }; + in { jobsets = pkgs.runCommand "spec-jobsets.json" {} '' cat >$out <tmp <`. + +You can then run the testsuite via :: - $ nix-build tests -A external.nixpkgs_20_03 - $ nix-build tests -A internal.nixpkgs_unstable - ... + $ nix flake check -L + +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 --------------------------------- diff --git a/flake.lock b/flake.lock index a9abdbc..fb5c7cf 100644 --- a/flake.lock +++ b/flake.lock @@ -15,9 +15,25 @@ "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": { "inputs": { "nixpkgs": "nixpkgs", + "nixpkgs-21_05": "nixpkgs-21_05", "utils": "utils" } }, diff --git a/flake.nix b/flake.nix index 3d8cfbe..46675ff 100644 --- a/flake.nix +++ b/flake.nix @@ -4,15 +4,50 @@ inputs = { utils.url = "github:numtide/flake-utils"; 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 = ; + # external-21_05 = ; + # ... + # } + allTests = pkgs.lib.listToAttrs ( + pkgs.lib.flatten (map (t: map (r: genTest t r) releases) testNames)); + + in { nixosModules.mailserver = import ./.; nixosModule = self.nixosModules.mailserver; - } // utils.lib.eachDefaultSystem (system: let - pkgs = nixpkgs.legacyPackages.${system}; - in { - devShell = pkgs.mkShell { + hydraJobs.${system} = allTests; + checks.${system} = allTests; + devShell.${system} = pkgs.mkShell { buildInputs = with pkgs; [ (python3.withPackages (p: with p; [ sphinx @@ -22,5 +57,5 @@ clamav ]; }; - }); + }; } diff --git a/tests/default.nix b/tests/default.nix deleted file mode 100644 index 68f2053..0000000 --- a/tests/default.nix +++ /dev/null @@ -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)