ci: add buildbot support (#1985)

Co-authored-by: Matt Sturgeon <matt@sturgeon.me.uk>
Co-authored-by: NAHO <90870942+trueNAHO@users.noreply.github.com>
Reviewed-by: Matt Sturgeon <matt@sturgeon.me.uk>
Reviewed-by: NAHO <90870942+trueNAHO@users.noreply.github.com>
Approved-by: Matt Sturgeon <matt@sturgeon.me.uk>
Approved-by: NAHO <90870942+trueNAHO@users.noreply.github.com>
Approved-by: Daniel Thwaites <danth@danth.me>
This commit is contained in:
0xda157 2025-11-22 10:59:01 -10:00 committed by GitHub
parent 51383904f3
commit adc6506100
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 83 additions and 1 deletions

1
buildbot-nix.toml Normal file
View file

@ -0,0 +1 @@
attribute = "ci.buildbot"

View file

@ -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");

View file

@ -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}"))
];
};
};
}

35
flake/options/ci.nix Normal file
View file

@ -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;
};
}

View file

@ -0,0 +1,9 @@
{ lib, ... }:
{
perSystem.options.testbeds = lib.mkOption {
internal = true;
type = lib.types.lazyAttrsOf lib.types.package;
default = { };
description = "Testbeds for Stylix.";
};
}