replace flake-utils input with nix-systems

We're only using `eachDefaultSystem` from flake-utils so pulling it in is
a bit overkill; using the underlying nix-systems dependency directly brings
us closer to a "stock" flake format without adding unnecessary burden.
This commit is contained in:
Bryton Hall 2023-07-07 23:44:44 -04:00
parent f7f2df7119
commit b231710109
2 changed files with 134 additions and 156 deletions

31
flake.lock generated
View file

@ -16,24 +16,6 @@
"type": "github" "type": "github"
} }
}, },
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1685518550,
"narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1686488075, "lastModified": 1686488075,
@ -52,11 +34,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1680945546, "lastModified": 1688590700,
"narHash": "sha256-8FuaH5t/aVi/pR1XxnF0qi4WwMYC+YxlfdsA0V+TEuQ=", "narHash": "sha256-ZF055rIUP89cVwiLpG5xkJzx00gEuuGFF60Bs/LM3wc=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "d9f759f2ea8d265d974a6e1259bd510ac5844c5d", "rev": "f292b4964cb71f9dfbbd30dc9f511d6165cd109b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -69,8 +51,8 @@
"root": { "root": {
"inputs": { "inputs": {
"flake-compat": "flake-compat", "flake-compat": "flake-compat",
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"systems": "systems",
"treefmt": "treefmt" "treefmt": "treefmt"
} }
}, },
@ -84,9 +66,8 @@
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-systems", "id": "systems",
"repo": "default", "type": "indirect"
"type": "github"
} }
}, },
"treefmt": { "treefmt": {

259
flake.nix
View file

@ -4,56 +4,52 @@
inputs = { inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
treefmt.url = "github:numtide/treefmt-nix"; treefmt.url = "github:numtide/treefmt-nix";
flake-utils.url = "github:numtide/flake-utils";
flake-compat = { flake-compat = {
url = "github:edolstra/flake-compat"; url = "github:edolstra/flake-compat";
flake = false; flake = false;
}; };
}; };
outputs = inputs @ { self, ... }: outputs = inputs@{ self, systems, ... }:
(inputs.flake-utils.lib.eachDefaultSystem (system: let
let eachSystem = f: inputs.nixpkgs.lib.genAttrs (import systems)
pkgs = import inputs.nixpkgs { (system: f inputs.nixpkgs.legacyPackages.${system});
inherit system; in
overlays = [ self.overlays.default ]; {
config.allowUnsupportedSystem = true; # evalModules with same interface as lib.evalModules and kubenix as special argument
}; evalModules = eachSystem (pkgs:
attrs @ { module ? null, modules ? [ module ], ... }:
inherit (pkgs) lib; let
lib' = pkgs.lib.extend (lib: _self: import ./lib/upstreamables.nix { inherit lib pkgs; });
kubenix = { attrs' = builtins.removeAttrs attrs [ "module" ];
lib = import ./lib { inherit lib pkgs; }; in
evalModules = self.evalModules.${system}; lib'.evalModules (pkgs.lib.recursiveUpdate
modules = self.nixosModules.kubenix; {
}; modules = modules ++ [{
config._module.args = {
# evalModules with same interface as lib.evalModules and kubenix as
# special argument
evalModules = attrs @ { module ? null, modules ? [ module ], ... }:
let
lib' = lib.extend (lib: _self: import ./lib/upstreamables.nix { inherit lib pkgs; });
attrs' = builtins.removeAttrs attrs [ "module" ];
in
lib'.evalModules (lib.recursiveUpdate
{
modules = modules ++ [{
config._module.args = {
inherit pkgs;
name = "default";
};
}];
specialArgs = {
inherit kubenix;
inherit pkgs; inherit pkgs;
name = "default";
};
}];
specialArgs = {
pkgs = import inputs.nixpkgs {
inherit (pkgs) system;
overlays = [ self.overlays.default ];
config.allowUnsupportedSystem = true;
}; };
}
attrs');
in
{
inherit evalModules pkgs;
devShells.default = pkgs.mkShell { kubenix = {
lib = import ./lib { inherit pkgs; inherit (pkgs) lib; };
evalModules = self.evalModules.${pkgs.system};
modules = self.nixosModules.kubenix;
};
};
}
attrs')
);
devShells = eachSystem (pkgs: {
default = pkgs.mkShell {
buildInputs = with pkgs; [ buildInputs = with pkgs; [
dive dive
fd fd
@ -73,107 +69,108 @@
export NODE_PATH="${pkgs.nodePackages.prettier-plugin-toml}/lib/node_modules:$NODE_PATH" export NODE_PATH="${pkgs.nodePackages.prettier-plugin-toml}/lib/node_modules:$NODE_PATH"
''; '';
}; };
});
formatter = (inputs.treefmt.lib.evalModule pkgs { formatter = eachSystem (pkgs: (inputs.treefmt.lib.evalModule pkgs {
projectRootFile = "flake.nix"; projectRootFile = "flake.nix";
programs = { programs = {
nixpkgs-fmt.enable = true; nixpkgs-fmt.enable = true;
black.enable = true; black.enable = true;
prettier.enable = true; prettier.enable = true;
shfmt.enable = true; shfmt.enable = true;
}; };
settings.global.excludes = [ settings.global.excludes = [
"docs/themes/*" "docs/themes/*"
"docs/layouts/*" "docs/layouts/*"
"modules/generated/*" "modules/generated/*"
]; ];
}).config.build.wrapper; }).config.build.wrapper);
apps = { apps = eachSystem (pkgs: {
docs = { docs = {
type = "app"; type = "app";
program = (pkgs.writeShellScript "gen-docs" '' program = (pkgs.writeShellScript "gen-docs" ''
set -eo pipefail set -eo pipefail
# generate json object of module options # generate json object of module options
nix build '.#docs' -o ./docs/data/options.json nix build '.#docs' -o ./docs/data/options.json
# remove all old module pages # remove all old module pages
rm ./docs/content/modules/[!_]?*.md || true rm ./docs/content/modules/[!_]?*.md || true
# create a page for each module in hugo # create a page for each module in hugo
for mod in ${builtins.toString (builtins.attrNames self.nixosModules.kubenix)}; do for mod in ${builtins.toString (builtins.attrNames self.nixosModules.kubenix)}; do
[[ $mod == "base" ]] && mod=kubenix [[ $mod == "base" ]] && mod=kubenix
[[ $mod == "k8s" ]] && mod=kubernetes [[ $mod == "k8s" ]] && mod=kubernetes
[[ $mod == "submodule"* ]] && continue [[ $mod == "submodule"* ]] && continue
echo "&nbsp; {{< options >}}" > ./docs/content/modules/$mod.md echo "&nbsp; {{< options >}}" > ./docs/content/modules/$mod.md
done done
# build the site # build the site
cd docs && ${pkgs.hugo}/bin/hugo "$@" cd docs && ${pkgs.hugo}/bin/hugo "$@"
'').outPath; '').outPath;
};
generate = {
type = "app";
program = (pkgs.writeShellScript "gen-modules" ''
set -eo pipefail
dir=./modules/generated
rm -rf $dir
mkdir $dir
nix build '.#generate-k8s'
cp ./result/* $dir/
rm result
'').outPath;
};
}; };
packages = { generate = {
default = pkgs.callPackage ./pkgs/kubenix.nix { type = "app";
inherit (self.packages.${system}); program = (pkgs.writeShellScript "gen-modules" ''
evalModules = self.evalModules.${system}; set -eo pipefail
}; dir=./modules/generated
docs = import ./docs {
inherit pkgs;
options = (self.evalModules.${system} {
modules = builtins.attrValues (builtins.removeAttrs
# the submodules module currently doesn't evaluate:
# error: No module found name/latest
# not sure how important that documentation is a this time
self.nixosModules.kubenix [ "submodule" "submodules" ]);
}).options;
};
}
// pkgs.lib.attrsets.mapAttrs' (name: value: pkgs.lib.attrsets.nameValuePair "generate-${name}" value)
(builtins.removeAttrs (pkgs.callPackage ./pkgs/generators { }) [ "override" "overrideDerivation" ]);
checks = rm -rf $dir
let mkdir $dir
wasSuccess = suite: nix build '.#generate-k8s'
if suite.success cp ./result/* $dir/
then pkgs.runCommandNoCC "testing-suite-config-assertions-for-${suite.name}-succeeded" { } "echo success > $out"
else pkgs.runCommandNoCC "testing-suite-config-assertions-for-${suite.name}-failed" { } "exit 1"; rm result
examples = import ./docs/content/examples; '').outPath;
mkK8STests = attrs: };
(import ./tests { inherit evalModules; }) });
({ registry = "docker.io/gatehub"; } // attrs);
in packages = eachSystem (pkgs: {
{ default = pkgs.callPackage ./pkgs/kubenix.nix {
# TODO: access "success" derivation with nice testing utils for nice output inherit (self.packages.${system});
testing = wasSuccess examples.testing.config.testing; evalModules = self.evalModules.${pkgs.system};
} };
// builtins.listToAttrs (builtins.map docs = import ./docs {
(v: { inherit pkgs;
name = "test-k8s-${builtins.replaceStrings ["."] ["_"] v}"; options = (self.evalModules.${pkgs.system} {
value = wasSuccess (mkK8STests { k8sVersion = v; }); modules = builtins.attrValues (builtins.removeAttrs
}) # the submodules module currently doesn't evaluate:
(import ./versions.nix).versions); # error: No module found name/latest
# not sure how important that documentation is a this time
self.nixosModules.kubenix [ "submodule" "submodules" ]);
}).options;
};
} }
)) // pkgs.lib.attrsets.mapAttrs' (name: value: pkgs.lib.attrsets.nameValuePair "generate-${name}" value)
// { (builtins.removeAttrs (pkgs.callPackage ./pkgs/generators { }) [ "override" "overrideDerivation" ])
);
checks = eachSystem (pkgs:
let
wasSuccess = suite:
if suite.success
then pkgs.runCommandNoCC "testing-suite-config-assertions-for-${suite.name}-succeeded" { } "echo success > $out"
else pkgs.runCommandNoCC "testing-suite-config-assertions-for-${suite.name}-failed" { } "exit 1";
examples = import ./docs/content/examples;
mkK8STests = attrs:
(import ./tests { evalModules = self.evalModules.${pkgs.system}; })
({ registry = "docker.io/gatehub"; } // attrs);
in
{
# TODO: access "success" derivation with nice testing utils for nice output
testing = wasSuccess examples.testing.config.testing;
} // builtins.listToAttrs (builtins.map
(v: {
name = "test-k8s-${builtins.replaceStrings ["."] ["_"] v}";
value = wasSuccess (mkK8STests { k8sVersion = v; });
})
(import ./versions.nix).versions)
);
nixosModules.kubenix = import ./modules; nixosModules.kubenix = import ./modules;
overlays.default = _final: prev: { overlays.default = _final: prev: {
kubenix.evalModules = self.evalModules.${prev.system}; kubenix.evalModules = self.evalModules.${prev.system};
}; };