diff --git a/buildbot-nix.toml b/buildbot-nix.toml new file mode 100644 index 00000000..3bc62e4a --- /dev/null +++ b/buildbot-nix.toml @@ -0,0 +1 @@ +attribute = "ci.buildbot" diff --git a/flake/default.nix b/flake/default.nix index 5fb20f75..4932617d 100644 --- a/flake/default.nix +++ b/flake/default.nix @@ -4,6 +4,8 @@ inputs.flake-parts.flakeModules.partitions ./deprecation ./modules.nix + ./options/ci.nix + ./options/testbeds.nix ./packages.nix ./propagated-packages.nix ]; @@ -15,6 +17,7 @@ partitionedAttrs = lib.genAttrs [ "checks" + "ci" "devShells" "formatter" ] (_: "dev"); diff --git a/flake/dev/packages.nix b/flake/dev/packages.nix index 39d6eb1a..dc6ed95f 100644 --- a/flake/dev/packages.nix +++ b/flake/dev/packages.nix @@ -7,12 +7,46 @@ # are derivations. checks = config.packages; + packages = config.testbeds; + # Testbeds are virtual machines based on NixOS, therefore they are # only available for Linux systems. - packages = lib.mkIf pkgs.stdenv.hostPlatform.isLinux ( + testbeds = lib.mkIf pkgs.stdenv.hostPlatform.isLinux ( import ../../stylix/testbed { inherit pkgs inputs lib; } ); + + ci.buildbot = { + packages = builtins.removeAttrs config.packages ( + builtins.attrNames config.testbeds + ); + # Batching testbeds by target, to avoid overwhelming buildbot + testbeds = lib.pipe config.testbeds [ + (lib.mapAttrsToList ( + name: testbed: + let + # name is formatted as `testbed:target:variant` e.g. `testbed:alacritty:dark` + splitName = lib.splitString ":" name; + in + { + target = builtins.elemAt splitName 1; + variant = builtins.elemAt splitName 2; + inherit testbed; + } + )) + (builtins.groupBy (entry: entry.target)) + (lib.mapAttrs (_: builtins.groupBy (entry: entry.variant))) + (lib.mapAttrs ( + _: + lib.mapAttrs ( + _: entries: + assert lib.length entries == 1; + (lib.head entries).testbed + ) + )) + (lib.mapAttrs (target: pkgs.linkFarm "testbeds-${target}")) + ]; + }; }; } diff --git a/flake/options/ci.nix b/flake/options/ci.nix new file mode 100644 index 00000000..cc80a4c3 --- /dev/null +++ b/flake/options/ci.nix @@ -0,0 +1,35 @@ +{ lib, config, ... }: +let + inherit (lib) types; +in +{ + perSystem.options.ci.buildbot = lib.mkOption { + type = types.lazyAttrsOf types.raw; + default = { }; + description = '' + A set of tests for [buildbot] to run. + [buildbot]: https://buildbot.nix-community.org + ''; + }; + + flake = { + # top-level CI option + # + # NOTE: + # This must be an actual option, NOT a set of options. + # Otherwise, flake partitions will not be lazy. + options.ci = lib.mkOption { + type = types.lazyAttrsOf (types.lazyAttrsOf types.raw); + default = { }; + description = '' + Outputs related to CI. + Usually defined via the `perSystem.ci` options. + ''; + }; + + # Transpose per-system CI outputs to the top-level + config.ci.buildbot = lib.mapAttrs ( + _: sysCfg: sysCfg.ci.buildbot + ) config.allSystems; + }; +} diff --git a/flake/options/testbeds.nix b/flake/options/testbeds.nix new file mode 100644 index 00000000..7bf4c960 --- /dev/null +++ b/flake/options/testbeds.nix @@ -0,0 +1,9 @@ +{ lib, ... }: +{ + perSystem.options.testbeds = lib.mkOption { + internal = true; + type = lib.types.lazyAttrsOf lib.types.package; + default = { }; + description = "Testbeds for Stylix."; + }; +}